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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 22:33   #1
Toni Milano
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 40
По умолчанию Переправа солдат

15 мужчин 2 мальчика
лодка может перевозить или 1 мужчину,или 1 мальчика,или 2 мальчика.
Помогите реализовать,очень срочно нужно,нашел код в учебнике на прологе но разобраться не могу!
Жлеательно на Паскале помогите
Toni Milano вне форума Ответить с цитированием
Старый 12.10.2011, 01:26   #2
wowsel
Begin'нер
Пользователь
 
Аватар для wowsel
 
Регистрация: 30.04.2010
Сообщений: 48
По умолчанию

наркоман что ли?
wowsel вне форума Ответить с цитированием
Старый 12.10.2011, 08:54   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

классическая задача о переправе..
Только, мне кажется, что условие НЕВЕРНО процитировано!

имхо, должно быть:
Цитата:
лодка может перевозить:
1 мужчину И 1 мальчика,
или 2-х мальчиков.
ну и ещё. Обычно в задаче что-то спрашивается! Вам что найти то надо?!
Или это на анимацию задача?!! o_O!

Последний раз редактировалось Serge_Bliznykov; 12.10.2011 в 08:56.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2011, 09:34   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Только, мне кажется, что условие НЕВЕРНО процитировано!
Серж, с таким условием она решается.

Цитата:
Или это на анимацию задача?!! o_O!
у меня вышло что-то типа того

Код:
{ Problem of men and boys crossing a river
by TinMan, programmersforum.ru }

{$H+}
uses
  strings;

const
  m0: word= 15;
  b0: word= 2;

  dir: array[-1..1] of string[6]= (' <<== ','',' ==>> ');
  men: array[0..1] of string[6]= ('','1 man ');
  boys: array[0..2] of string[6]= ('','1 boy ','2 boys');
  endl: string[2]= #$0D+#$0A;

procedure Cross(d,m,b,dm,db: integer; s: string);
var
  t: string[2];
begin
  if m+b=0 then begin
    write(s);
    readln;
    halt
  end;
  if dm+db<>0 then s:= s+'                '+dir[d]+' '+men[dm]+boys[db]+' '+dir[d]+endl;
  m:= m-dm*d;
  b:= b-db*d;
  Str(m:2,t);
  s:= s+t+' men ';
  Str(b:2,t);
  s:= s+t+' boys                       ';
  Str(m0-m:2,t);
  s:= s+t+' men ';
  Str(b0-b:2,t);
  s:= s+t+' boys'+endl;
  d:= -d;
  if (d>0) and (m>0) then Cross(d,m,b,1,0,s);
  if db in [0,2] then
    if (d>0) and (b>0) or (d<0) and (b0-b>0) then Cross(d,m,b,0,1,s);
  if db in [0,1] then
    if (d>0) and (b>1) or (d<0) and (b0-b>1) then Cross(d,m,b,0,2,s);
end;

begin
  Cross(-1,m0,b0,0,0,'');
  writeln('no way');
  readln
end.
Добавлено:
Добавлю, на всяк пожарный случай: в TP оно по идее работать должно, но результат будет выдавать НЕВЕРНЫЙ. Чтобы все было нормально, нужно использовать компилятор с нуль-терминированными строками (их включает опция H+). Я проверял на FPC.

И еще подправил по мелочи (в частности, выкинул отладочную печать).
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 12.10.2011 в 09:50.
TinMan вне форума Ответить с цитированием
Старый 12.10.2011, 10:45   #5
Toni Milano
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 40
По умолчанию

Спасибо у меня 2 задачи было с "И" и "ИЛИ"
Toni Milano вне форума Ответить с цитированием
Старый 12.10.2011, 10:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Toni Milano
Спасибо у меня 2 задачи было с "И" и "ИЛИ"
понятно.

Цитата:
Сообщение от TinMan
Серж, с таким условием она решается.
ну да.
Шаг 1: Два мальчика едут на другой берег,
Шаг 2: один возвращается.
Шаг 3: Потом солдат переправляется на другой берег.
Шаг 4: Если на исходном берегу остались ещё солдаты, то
Шаг 5: Второй мальчик возращается. Переход на шаг 1.
Шаг 6. Иначе - все солдаты перевезены. Задача решена.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.10.2011, 09:22   #7
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
... Задача решена.
Это, конечно, верно, но фишка-то в не том, чтоб решить, а в том, чтоб сделать программу, которая решает!

В моем коде - не просто печать этих шагов. Там решение задачи посредством перебора через рекурсию. Можно задать другие числа - например, 10 мужчин и 4 мальчика (будет выдано первое встреченное решение, не все), или 5 мужчин и 1 мальчик (будет выдано, переправа невозможна). Я слишком спешил, когда постил решение, так что небольшие пояснения приведу сейчас (пока не забылись).

Собственно, сам процесс перевоза нетрудно закодить, хотя я потратил все же прилично времени (больше часа), чтоб сделать наиболее компактно. Но самое интересное в том, что оно зациклилось.. Не из-за ошибки, а по смыслу. Например, один человек начинал ездить туда-обратно без особого толку )). Но это еще простой случай - иногда могут быть цыклы подлиннее. И тогда пришлось ввести дополнительные ограничения, и вот самое интересное было придумать их. Я до сих пор не уверен, что я поставил их правильно. Дело же в том, что, если размахнуться пошире и не заботиться о том, насколько сильны эти ограничения, то можно прийти просто к печати заданной последователности шагов - и решения как такового не будет..

Короче, я поставил два дополнительных ограничения:
1. мужчина не дожен ездить ОБРАТНО, раз прибыв на другой берег, он остается там;
2. только что приехавший мальчик (один) не должен тут же уезжать обратно (тоже один).
Логически эти ограничения верны, конечно - ибо запрещенные действия как бы бессмысленны. Но все же я сомневаюсь в них - ведь в конечном итоге, бессмысленно ВСЕ, что не есть решение! Особенно сомневаюсь в первом, оно мне кажется слишком натянутым. Если кто-нибудь попробует придумать более естественные (менее искусственные))) ограничения, я буду очень рад взглянуть на них.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
3d модели солдат Selestis Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 10.08.2010 00:11
Переправа через реку mivel Помощь студентам 3 19.04.2010 21:41
Переправа Spark3r Общие вопросы C/C++ 6 13.01.2010 12:35