Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2013, 20:11   #1
Алёнка ))
 
Регистрация: 15.10.2013
Сообщений: 3
По умолчанию Замок для сейфа состоит из 10 расположенных в ряд ячеек c игральными кубиками. Сумма любых трёх равна 10. Найти код (на Паскале)

ПОЖАЛУЙСТА, ПОМОГИТЕ НАПИСАТЬ КОД ДЛЯ ЗАДАЧИ В ПАСКАЛЕ.

секретный
замок для сейфа состоит из 10 расположенных в ряд ячеек,в которые надо
вставить игральные кубики.Но дверь открывается только в том случае,когда
в любых трех соседних ячейках,сумма точек на игральных гранях кубиков
равна 10.(игральный кубик имеет на каждой грани от 1 до 6
точек). напишите программу,которая разгадывает код замка при условии что 2 кубика уже вставлены в ячейки
Алёнка )) вне форума Ответить с цитированием
Старый 15.10.2013, 20:40   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

если банально - то обычным перебором в цикле... с учетом расставленных двух кубиков...
ну или придумать какой-то алгоритм для более разумного перебора.. нацеленного...

какие мысли у вас по этому поводу?
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 15.10.2013, 22:51   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Аленка, допустим кубики стоят в 1-ой и 2-ой ячейке, то все очень просто - проверить чтобы их сумма была не меньше 4 и не больше 9, остальные ячейки заполнять недостающей цифрой до 10 от предыдущих двух кубиков. Аналогично для последней и предпоследней ячеек и очень похоже для двух подряд в любом месте. Если между ними одна пустая тоже засунуть в промежуток нужную цифру и дальше как для двух в любом месте. Хуже когда между ними больше одной ячейки. Интервал между ними скорее всего перебором. Сделайте самый первый случай, думаю с головой хватит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 00:50   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Аватар, не давай алгоритмы кому попало, а то обвинят в соучастии . А иных следаков, я видел только в фильмах, осталиные - дебилы. Ну, о 5 000-х купюрах, не без нашего брата обошлось. А мест на зонах, хватает. Ещё даже и недозаполнены.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 16.10.2013 в 00:57.
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.10.2013, 04:06   #5
Алёнка ))
 
Регистрация: 15.10.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от VIK_aka_TOR Посмотреть сообщение
если банально - то обычным перебором в цикле... с учетом расставленных двух кубиков...
ну или придумать какой-то алгоритм для более разумного перебора.. нацеленного...

какие мысли у вас по этому поводу?
проблема в том, что никаких. Я сделала часть программы для тех ячеек, что стоят рядом, но для тех, которые стоят через 2 и более я вообще не знаю что писать.

Цитата:
Сообщение от Аватар Посмотреть сообщение
Аленка, допустим кубики стоят в 1-ой и 2-ой ячейке, то все очень просто - проверить чтобы их сумма была не меньше 4 и не больше 9, остальные ячейки заполнять недостающей цифрой до 10 от предыдущих двух кубиков. Аналогично для последней и предпоследней ячеек и очень похоже для двух подряд в любом месте. Если между ними одна пустая тоже засунуть в промежуток нужную цифру и дальше как для двух в любом месте. Хуже когда между ними больше одной ячейки. Интервал между ними скорее всего перебором. Сделайте самый первый случай, думаю с головой хватит
если бы этого с головой хватило :-( Увы. Я сделала для тех, что стоят рядом. Но мне благополучно преподаватель сказал, что для любых нужно сделать. А как я не представляю.

Последний раз редактировалось Stilet; 16.10.2013 в 08:17.
Алёнка )) вне форума Ответить с цитированием
Старый 16.10.2013, 06:27   #6
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
в любых трех соседних ячейках,сумма точек на игральных гранях кубиков
равна 10
При условии что мы знаем позиции и значения кубиков. Если не знаем, то скажите- переделать можно.
Код:
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int adr1,adr2;
    int item1,item2;
    int summ;
    int min;
    cout << "Adr1 Item1 Adr2 Item 2" << endl; 
   cin>>adr1>>item1;
   cin>>adr2>>item2;
   
   if(adr1==adr2)
        {
         cout<<"Adr1=Adr2";
         return 1;
        }
     
   summ=item1+item2;
   
    if (fabs(adr2-adr1)>1)
        {
          cout<<"Ne sosednie kubiki";
          return 1;
        }
    if (summ<4||summ>9)
        {
        cout<<"Oshibka summ";
        return 1;
        }
    
     min=adr2;
     if (adr1<adr2) 
     min=adr1;
     
   
   switch (min)
   {
       case 1: cout<<"CUB :  "<<10-summ<<endl<<"ADRESS CUB  : "<<3;break;
       case 9: cout<<"CUB :  "<<10-summ<<endl<<"ADRESS CUB  : "<<8;break;
       default: cout<<"CUB :  "<<10-summ<<endl<<"ADRESS CUB  : "<<min-1<<"  or  "<< min+2; break;
       
   }
  

   return 0;
}
З.Ы. по проверкам на корректность не все продуманно. Варианты с отрицательным вводом нужно отбросить ну и еще подумайте.

ОМГ ОМГ!!! Паскаль!
Простите-простите! Я на плюсах написал(((
Но алгоритм прозрачен, думаю переделать не сложно )
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 16.10.2013 в 06:46.
SaLoKiN вне форума Ответить с цитированием
Старый 16.10.2013, 07:19   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

SaLoKiN а в паскаль сможете переделать.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 07:24   #8
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Bugrimov
Мне проще псевдокодом написать=) но если сильно надо-могу. Просто я не вижу в этом сложности для Алёнка )). Тем более она говорит что уже написала, но только не все. Просто дописать и все! =)

Код:
тип целые
adr1(адрес 1ого кубика)
adr2(адрес 2ого кубика)
item1(значение 1ого кубика)
item2(значение 2ого кубика)
summ(для подсчета суммы)
min(для нахождения самого левого кубика из 2ух) 

Вводим Adr1 Item1 Adr2 Item 2

Если (adr1==adr2) 
    То ошибка ввода. Выход.
     
посчитали сумму  
summ=item1+item2; 


Проверка на соседство
 Если (модуль((adr2-adr1)>1) // модуль т.к. adr1 может быть больше adr2 
     То ошибка ввода. Выход.

Проверка на возможность суммы 10 из 3-ех кубиков    
Если (summ<4||summ>9) // кубик от 1 до 6. тогда сумма двух других должна лежать в диапазоне от 4 до 9
        То ошибка ввода. Выход.

Ищем самый левый адрес кубика    
     min=adr2;
     if (adr1<adr2) 
     min=adr1;
     

Если min =1  т.е.наши кубики лежат в 1 и 2
То адрес 3-его равен 3,а значение 10- summ

Если min =9  т.е.наши кубики лежат в 9 и 10
То адрес 3-его равен 8,а значение 10- summ
Иначе
Адрес равен min-1 или min+2 и значение 10-summ
для тех кто пишет на паскале, это на две минуты работы ;-)

И не забываем проверку на 0 и отрицательные числа на входе.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 16.10.2013 в 08:00.
SaLoKiN вне форума Ответить с цитированием
Старый 16.10.2013, 09:05   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не люблю в паскале ввод-вывод, поэтому в дельфи по кнопке со случайной генерацией начального расклада и вывода результата в Memo. Надеюсь не будет проблем переделать на традиционный паскаль
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,i1,i2: Integer;
    a: array[1..10] of Integer;
    xOk: Boolean;
begin
  Memo1.Clear;
  Randomize;
  for i:=1 to 10 do a[i]:=0;
  i1:=Random(10)+1;
  repeat
    i2:=Random(10)+1;
  until i1<>i2;
  if i1>i2 then begin i:=i1; i1:=i2; i2:=i; end;
  a[i1]:=Random(6)+1; Memo1.Lines.Add(Format('a[%d]=%d',[i1,a[i1]]));
  a[i2]:=Random(6)+1; Memo1.Lines.Add(Format('a[%d]=%d',[i2,a[i2]]));
  if i2-i1>1 then begin
    for i:=Max(4-a[i1],1) to Min(9-a[i1],6) do begin
      a[i1+1]:=i;
      for j:=i1+2 to i2-1 do a[j]:=10-a[j-1]-a[j-2];
      xOk:=a[i2]+a[i2-1]+a[i2-2]=10;
      if xOk then Break;
    end;
    if not xOk then begin Memo1.Lines.Add('Нет решения'); Exit; end;
  end;
  for i:=i1-1 downto 1 do begin
    a[i]:=10-a[i+1]-a[i+2];
    if (a[i]<1) or (a[i]>10) then begin Memo1.Lines.Add('Нет решения'); Exit; end;
  end;
  for i:=i2+1 to 10 do begin
    a[i]:=10-a[i-1]-a[i-2];
    if (a[i]<1) or (a[i]>10) then begin Memo1.Lines.Add('Нет решения'); Exit; end;
  end;
  for i:=1 to 10 do Memo1.Lines.Add(Format('%d: %d',[i,a[i]]));
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 09:22   #10
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Код:
 for i:=1 to 10 do Memo1.Lines.Add(Format('%d: %d',[i,a[i]]));
может не до 10?
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести все двухзначные числа, сумма которых равна N. djquins Помощь студентам 5 27.06.2013 12:03
Дан ряд любых чисел. Когда повторяется число второй раз, то его надо удалить. Katia1234 Помощь студентам 6 05.05.2012 10:09
Дана матрица А[m,n]. Найти первый столбец, сумма элементов которого равна сумме элементов первой строки. edikesh Помощь студентам 3 01.12.2011 19:21
Для любых 2 матриц (вводятся) надо найти объединение и пересечение этих матриц (Pascal) novicok Помощь студентам 6 15.09.2011 09:51
Двумерный массив.Поиск столбца сумма,которого равна 0 Almost456 Паскаль, Turbo Pascal, PascalABC.NET 5 30.11.2008 23:43