Автор: Админка

Старинная задача про волка козу и капусту


Ответ на задачу про волка, козу и капусту.

Задача про волка, козу и капусту – одна из самых известных и популярных задач о переправе. В данной статье мы разберём решение данной задачи.

Формулировка.

Однажды крестьянину понадобилось перевезти через реку волка, козу и капусту. У крестьянина есть лодка, в которой может поместиться, кроме самого крестьянина, только одно существо или предмет — или волк, или коза, или капуста. Если крестьянин оставит без присмотра волка с козой, то волк съест козу; если крестьянин оставит без присмотра козу с капустой, коза съест капусту. Как крестьянину перевезти на другой берег всё своё имущество в целости и сохранности?

Решение.

Стоит сразу заметить, что коза взаимодействует сразу с двумя объектами: и волком, и капустой. Поэтому первой с собой стоит взять именно её.

  • Берём козу и перевозим её на другой берег, высаживаем.
  • Возвращаемся обратно, берём волка и перевозим его на другой берег.
  • Высаживаем волка, забираем козу и везём её обратно.
  • Высаживаем козу, забираем капусту и везём её на другой берег.
  • Высаживаем капусту и возвращаемся обратно, берём козу и везём её на другой берег
  • Высаживаем козу – все в сборе.

У этой задачи есть и другой не очень принципиально отличающееся решение: капусту и волка можно поменять местами. Основная идея – не оставлять козу с волком или капустой.

Похожие статьи

Волк, коза и капуста. Загадка на логику.

Эта известная головоломка есть в народном творчестве таких стран, как Италия, Румыния, Эфиопия и Зимбабве. Существует не одна ее вариация: с лисой, курицей и хлебом или с пантерой, свиньей и кашей! А Ты знаешь, как решать задачу о переправе?

14 92 т.

Итак, представь, что Ты — фермер, у которого есть маленькая лодка. С одного берега реки на другой Тебе необходимо перевезти волка, козу и капусту. Всех вместе взять нельзя — нужно переправлять каждого «пассажира» по отдельности. Но имей в виду, что когда Ты повезешь на другой берег капусту, в это время волк съест козу. А если решишь везти волка — коза скушает капусту.

Что же делать? Хорошенько поразмысли. Рейсов можно делать сколько угодно — главное, чтобы все оставалось целым и невредимым.

Ну как, удалось решить эту нелегкую задачку? Все еще нет? Ну ладно, дам одну подсказку: переправлять «пассажира» можно не только туда, но и назад!

Что же — думаю, теперь Тебе удалось перевезти всех целыми и невредимыми! Посмотри на решение задачи и проверь, все ли сходится.

  1. Сначала нужно перевезти козу, оставив волка с капустой.
  2. Теперь возвращаемся и забираем волка. Но оставлять волка с козой на новом берегу нельзя.
  3. Поэтому берем козу с собой в лодку, а волк сидит на берегу одинокий и голодный.
  4. Козу оставляем на берегу, а капусту переправляем к волку.
  5. Возвращаемся назад и забираем козу.

Кстати, это не единственный вариант решения задачи. Вот еще один:

  1. Везем козу туда.
  2. Возвращаемся обратно.
  3. Везем капусту туда.
  4. Забираем козу назад.
  5. Везем волка туда.
  6. Возвращаемся за козой.
  7. Перевозим козу туда.

Готово!

А теперь признавайся, удалось ли Тебе самостоятельно дойти до правильного решения, и если да — то каким способом? ;)

Еще больше отборных загадок найдешь тут:

Заметили орфографическую ошибку? Выделите её мышкой и нажмите Ctrl+Enter

Загадка про волка, козу и капусту

На чтение 1 мин. Просмотров 68

Крестьянину нужно перевезти через реку волка, козу и капусту. Но лодка такова, что в ней может поместиться только крестьянин, а с ним или только волк, или только коза, или только капуста. Но если оставить волка с козой, то волк съест козу, а если оставить козу с капустой, то коза съест капусту. Как перевез свой груз крестьянин?

Ответ

Ясно, что приходится начать с козы. Крестьянин, перевезя козу, возвращается и берет волка, которого перевозит на другой берег, где его и оставляет, но зато берет и везет обратно на первый берег козу. Здесь он оставляет ее и перевозит к волку капусту. Вслед затем, возвратившись, он перевозит козу, и переправа оканчивается благополучно.

15 интересных логических задачек для детей и взрослых

15 интересных логических задачек для детей и взрослых

Логические игры и головоломки — это отличное развлечение как для детей, так и для взрослых. Они вырабатывают привычку думать, рассуждать, делать выводы и всегда стараться найти решение проблемы.

Задачка про волка, козу и капусту

Помните старинную задачу про волка, козу и капусту? Кто не решал ее в детстве! Предложите задачу своему ребенку! Мужику нужно перевезти через реку волка, козу и капусту. Но в лодке может поместиться только он сам, а с ним или только волк, или только коза, или только капуста. Но если оставить волка с козой, то волк съест козу, а если оставить козу с капустой, то коза съест капусту. Как мужику перевезти свой груз?

Решение:

Нужно начать с козы. Перевезя ее, мужик возвращается на другой берег и берет волка. Переправив волка, он оставляет его на другом берегу, но зато берет козу и везет ее обратно на первый берег. Здесь он оставляет ее и перевозит к волку капусту. Затем, вернувшись, берет козу — переправа благополучно заканчивается.

Детективная задачка

На лугу лежат пять кусочков угля, одна морковь и шарф. Никто не клал их туда. Почему они там лежат?

Решение:

Дети использовали эти предметы, когда лепили снеговика зимой. С приходом весны снеговик растаял, и пять кусочков угля, морковка и шарф остались лежать уже на лугу.

Летная задачка

Мужчина выпрыгивает без парашюта из самолета. Высадка небезопасная, но мужчина остается целым и невредимым. Почему?

Решение:

Самолет находится ещё на взлётно-посадочной полосе.

Задачка про ноги

Ваня идет к лесному озеру. Ему навстречу движется класс из 25 учеников и двух преподавателей. Родители 10 детей также принимают участие в прогулке. Пять матерей еще везут своих детей на колясках. Преподаватель ведет с собой собаку. Сколько ног идут по дороге к лесному озеру?

Решение:

По дороге к лесному озеру идут только две ноги — Ванины. Все, кого он встретил, возвращаются с озера.

Сколько ворон?

Вишня у Маши плодоносит в большом количестве. К сожалению, на дерево садятся вороны и безжалостно клюют плоды. Вечером Маша считает ворон. Их 38! Это настолько выводит ее из себя, что она ловит одну ворону сачком. Сколько ворон осталось на дереве?

Решение:

Осталась только одна ворона, пойманная Машей. Остальные вороны испугались и улетели.

Задачка на внимательность

Молодая девушка заказывает в кафе яблочный сок, рулет и шоколадное мороженое. Официант, который принимает заказ, приносит ей вскоре все желаемое. После того как девушка оплатила заказ, официант спросил: «Трудно работать в полиции?» Как он догадался, что девушка — полицейский?

Решение:

Девушка была в полицейской форме.

День рождения князя

Когда князь празднует день рождения, его подданные должны принести ему достойный подарок: самую сочную ветчину, самый пряный сыр, самую упитанную курицу, искусно выделанные шкурки, плетеные корзинки, глиняные кувшины и резные изделия. Крестьянин сделал князю необычный подарок: бутылку с яблочным соком. Отличие этого подарка — яблоко находится в бутылке. Князь поражен: каким образом тот смог засунуть яблоко в бутылку? «Как ты сделал это? При помощи колдовства?» — спрашивает князь. Крестьянин отвечает: «Догадайтесь сами, но я вовсе не чародей!» Как яблоко попадает в бутылку?

Решение:

Крестьянин надевает бутылку на яблоневую ветку вскоре после цветения. Таким образом, плод развивается в бутылке.

Еще один вид логических игр придется всем по вкусу — это игры с палочками. Для игры понадобится набор счетных палочек или любые палочки одинаковой длины и толщины (например, спички, с которых предварительно счистили серу), подойдут и полоски картона. Если вы играете вместе с детьми, то можно давать устные задания. Если ребенок играет один, подготовьте карточки с рисунком и условием игровой задачи.

Задание № 1

Переложи одну палочку так, чтобы дом смотрел в другую сторону.

Задание № 2

Переложи 3 палочки так, чтобы корова оглянулась и подняла хвост.

Еще несколько заданий с палочками из пособия С. И. Волковой «Математика и конструирование» (1−4 классы):

А в завершении мы хотим предложить вам самостоятельно изготовить знаменитую китайскую головоломку «Танграм». И в этом нам опять поможет пособие С. И. Волковой «Математика и конструирование».

Из деталей этой головоломки можно складывать разные фигуры. Сложите для начала 1 и 2 фигуры. Рисунок вам поможет. Теперь попробуйте сложить фигуры 3, 4, 5, 6. И с этим справились? Поздравляем!

Надеемся, что выполняя предложенные задания, вы и ваш ребенок не раз испытали радость от приложенных интеллектуальных усилий, а главное — от самостоятельно найденного решения.

Фото: NadyaEugene/masterone/Shutterstock.com, архив пресс-службы,

Задача «Волк, коза и капуста»

Удивительные находки и неразгаданные загадки

И.Г. СУХИН, Институт теории образования и педагогики РАО

 

Во многих математических монографиях есть страницы, посвященные истории возникновения знаменитых задач, доступных учащимся старших классов (например, Чистяков В.Д. Старинные задачи по элементарной математике — Минск, 1978). Однако практически нет работ, из которых учитель начальной школы мог бы получить исчерпывающую информацию о не менее известных старинных головоломках, представляющих интерес для учеников I–IV классов. Нам хотелось бы поделиться с читателями журнала результатами своих поисков и начать разговор о поразительной судьбе некоторых из таких задач.

В “Книге 1” труда Е.И. Игнатьева “В царстве смекалки, или Арифметика для всех: Опыт математической хрестоматии: Книга для семьи и школы” (СПб.: Тип. А.С. Суворина, 1911. — С. 75–76) приведена одна из самых замечательных логических задач в истории человечества: “Задача 52-я. Волк, коза и капуста”:

“Крестьянину нужно перевезти через реку волка, козу и капусту. Но лодка такова, что в ней может поместиться только крестьянин, а с ним или один волк, или одна коза, или одна капуста. Но если оставить волка с козой, то волк съест козу, а если оставить козу с капустой, то коза съест капусту. Как перевез свой груз крестьянин?”

Даже если приводимая задача вам знакома, не спешите читать решение, попробуйте словно впервые поискать оптимальный маршрут и только затем ознакомьтесь с ходом решения, предлагаемым Е.И. Игнатьевым:

“Решение: Ясно, что приходится начать с козы. Крестьянин, перевезши козу, возвращается и берет волка, которого перевозит на другой берег, где его и оставляет, но зато берет и везет обратно на первый берег козу. Здесь он оставляет ее и перевозит к волку капусту. Вслед затем, возвратившись, он перевозит козу, и переправа оканчивается благополучно”.

Данная задача бессчетное число раз публиковалась в самых различных отечественных газетах, журналах и сборниках. При этом почти во всех работах упоминается только одно решение. А ведь есть и альтернативный путь!

Вначале крестьянин опять-таки перевозит козу. Но вторым он не обязательно должен забирать волка! Можно взять капусту, отвезти ее на другой берег, оставить там и вернуть на первый берег козу. Затем перевезти на другой берег волка, вернуться за козой и снова отвести ее на другой берег. В этом случае количество рейсов (7) точно такое же, как и в опубликованном выше варианте.

Существование двух решений не отмечено ни в многократных переизданиях книги Е.И. Игнатьева, ни в других самых авторитетных источниках. В их числе: Э. Люкас “Математические развлечения: Приложение арифметики, геометрии и алгебры к различного рода запутанным вопросам, забавам и играм” (СПб.: Изд. Павленкова, 1883. — С. 7), Н.Н. Аменицкий, И.П. Сахаров “Забавная арифметика: Хрестоматия для развития сообразительности и самодеятельности детей в семье и в школе” (М.: Изд. товарищества И.Д. Сытина, 1909. — С. 23–24), В. Аренс “Математические игры и развлечения” (СПб.: Физика, 1911. — С. 20), Б.А. Кордемский “Математическая смекалка” (М.: Государственное издательство технико-теоретической литературы, 1955. — С. 14; М.: Наука, 1991. — С. 15) и многочисленные сборники последних лет.

Это тем более удивительно, что наличие двух решений было указано, к примеру, еще в начале 20-х годов ХХ века в книге В. Литцмана “Веселое и занимательное в фигурах и числах: Математические развлечения” (М. — Пт.: Изд. Л.Д. Френкель, 1923. — С. 128–129), причем довольно подробное. Видимо, многие издатели сочли необязательным приводить оба варианта, ведь они схожи и являются по сути “зеркальными”. Но в книге для детей, особенно младшего возраста, это необходимо, иначе существенно снижается педагогическая ценность задачи!

Любопытно, что Б.А. Кордемский в решении отмечает только второй вариант и по какой-то причине не упоминает первый. Загадка? Загадка.

Очень интересен вопрос о времени возникновения данной головоломки и ее первоисточнике. Б.А. Кордемский в книге “Математическая смекалка” говорит вскользь: “Это... старинная задача; встречается в сочинениях VIII века”.

Вначале может показаться, что мы имеем дело с опечаткой, ведь первая или одна из первых отечественных публикаций задачи “Волк, коза и капуста” датирована концом ХVIII века. В фондах Российской Исторической библиотеки сохранилась книга “Гадательная арифметика для забавы и удовольствия” (СПб., 1789). На титульном листе значится: “На ижд. изд. И. Краснопольского”, что означает “на иждивении издателя И. Краснопольского”. В раритете на 62 страницах сорок одна занимательная задача. На с. 42–43 читаем: “Некоторый мужик везши с собою волка, козу и капусту приехал к реке, у берегу коей нашел столь малую лодку, что она кроме его и одного чего-нибудь из везомых им, поднимать не могла. И так спрашивается, каким образом переправить оных через реку так, чтобы волк не съел козы, а коза капусты?” Далее приводится один вариант решения (первый).

Интересно, что в пособии болгарских авторов “Математический фольклор” (М.: Знание, 1987. — С. 180) задача о волке, козе и капусте помещена в раздел “Из математического фольклора других стран” с пометкой в скобках “Россия”.

Вернемся к истории задачи и вопросу: прав ли Б.А. Кордемский, датировав задачу восьмым веком.

По мнению ряда историков, задача имеет западные корни. В. Аренс указывает, что авторство хрестоматийной задачи приписывается Алкуину (Аренс В. Математические игры и развлечения. — СПб.: Физика, 1911. — С. 20).

В. Литцман, предлагая читателям познакомиться с задачей о переправе в книге “Веселое и занимательное о числах и фигурах” (М.: Государственное издательство физико-математической литературы, 1963. — С. 189), вскользь пишет: “У Алкуина мы находим следующий рассказ”.

Что же в наши дни известно об этой незаурядной личности? Алкуин (735–804) был ученым монахом и математиком из Ирландии, автором ряда учебников по математике. Король Карл Великий благоволил к ученым и всячески поощрял развитие наук. За королевским круглым столом нередко проводились состязания в решении хитроумных головоломок, в которых Алкуин имел возможность проявить свои незаурядные способности.

Алкуин основал Палатинскую школу в Туре (созданную для детей Карла V), принимал участие в основании университета в Париже. Добавим, что Алкуин был другом и учителем Карла Великого, его ученым советником.

Из других головоломок Алкуина наибольшую известность получили задачи 1) о гончей и зайце, 2) о покупке свиней, 3) о трех наследниках и 21 бочке, 4) о ста мерах пшеницы, 5) о быке. Но только головоломка о волке, козе и капусте до сих пор поражает воображение и детей, и взрослых. Эту и некоторые другие задачи Алкуин поместил в свой трактат “Задачи для оттачивания ума юношей”, написанный, как было принято в то время, латиницей.

Перед публикацией данной статьи очень хотелось подержать в руках текст первоисточника. А вдруг там приведены оба решения? И вот копия латинского манускрипта передо мной. Под №ХVIII легендарная задача. Сразу бросается в глаза, что решение одно — то самое, которое приводится в большинстве пособий. Но сама головоломка имеет иное название: “Задача о человеке, козе и волке”! А ее условие (если переводить близко к оригиналу) таково:

“Один человек должен был перевезти через реку волка, козу и кочан капусты. И не удалось ему найти другого судна, кроме как такого, которое могло выдержать только двоих из них. Задача, таким образом, заключалась в том, как всех перевезти на другой берег целыми и невредимыми. Скажите, кто способен: каким путем они могут перебраться на другой берег невредимыми” (перевод с латинского выполнен Е.И. Сухиной).

Так что же, все загадки разгаданы? Нет, последнее десятилетие преподносит новые сюрпризы. Вот уже в нескольких изданиях при объяснении решения данной головоломки авторы делают одну и ту же забавную ошибку. Раскроем на с. 244 пособие Е.А. Латия “365 развивающих игр и затей для маленьких детей” (М.: Эксмо-Пресс, 2001), где предлагаемое решение столь фантастично, что его следует воспроизвести дословно: “Разгадка: сперва везут волка и капусту, оставляют капусту на противоположном берегу; везут волка обратно и оставляют на берегу; забирают козу, переправляют на другой берег; там забирают капусту, везут обратно к волку и уже вместе их окончательно перевозят на другой берег”.

Если бы волка и капусту можно было везти в лодке одновременно, то переправа завершилась бы гораздо быстрее, чем указано Е.А. Латием (но по условию задачи их нельзя переправлять вместе!) В вышедшей ранее раскраске “Угадайка: Выпуск 4” (М.: Крона, 1996) волка заменили на крокодила, козу — на пирата Крюка, а капусту — на Питера Пэна, но решение аналогично предыдущему: “Сначала надо перевезти Питера и крокодила...” и т.д. Очевидно, что первоисточник ошибки один и тот же. Быть может вам удастся найти его?

А вдруг это Алкуин через века задумал подшутить над нами? Ничем другим я не могу объяснить то обстоятельство, что и сам первоначально при объяснении второго варианта решения указал не 7 рейсов, а 11, причем заметил свою оплошность в самый последний момент.

Да, еще не все тайны замечательной задачи разгаданы, и не исключено, что лукавая улыбка Алкуина будет преследовать не одно поколение авторов, составителей и читателей.

 

Где еще можно прочитать об Алкуине и его знаменитой задаче

Баврин И.И., Фрибус Е.А. Занимательные задачи по математике — М.: ВЛАДОС, 1999.

Баврин И.И., Фрибус Е.А. Старинные задачи — М.: Просвещение, 1994.

Белов В.Н. Головоломки из близкой дали // Компьютерра. — 2000. — № 1.

Депман И.Я. История арифметики — М.: Просвещение, 1965.

Леман И. Увлекательная математика — М.: Знание, 1985.

Попов Г.Н. Сборник исторических задач по элементарной математике — М. — Л.: Главная редакция научно-популярной и юношеской литературы, 1938.

 

НАЧАЛЬНАЯ ШКОЛА №7-2002, c. 69-70.

 

 

Задача про волка, козла и капусту

Задача про волка, козла и капусту

07.06.2018 Загадки для детей



Известная старая задача, где крестьянину нужно переправить через реку волка, козла и капусту.

Крестьянин должен переравить через резку козла, волка и капусту. Но проблема в том, что лодка маленькая, и кроме крестьянина может вместить еще только одного пассажира, либо волка, либо козла. Но если оставить волка с козлом, то волк съест козла, а если оставить козла с капустой, то козел съест капусту.

Как крестьянину перевезти всех на другой берег?

 

Правильный ответ:

Сначала нужно перевести козла на другой берег. Потом крестьянин должен вернуться взять волка, перевезти его на другой берег и там оставить но при этом забрать козла на первый берег. Здесь крестьянин его оставляет и перевозит к волку капусту. Затем возвращается и перевозит козла.



Похожие новости

08.07.2020 Загадки для детей

08.07.2020 На логику

07.07.2020 На логику

07.07.2020 На внимательность

06.07.2020 На логику

06.07.2020 На логику

Решение проблемы с волком, козой и капустой (форум Programming Diversions на Coderanch)

Нет, Джим Инст, вам не нужно думать о том, что происходит, когда фермер переходит реку, или о том, что делает лодка; вы просто предполагаете, что лодка находится там, где находится фермер. На самом деле я получил 16 возможных состояний, пронумерованных от 0 до f, где самый старший бит (3-й бит = 8) представляет фермера, 2-й бит = 4 - это волк, 1-й бит = 2 - это гусь, а 0- -й бит (младший бит = 1) представляет собой зерно капусты или что-то еще.

Итак, f означает, что все четверо находятся на этой стороне реки, 0 означает, что все четыре пересеклись, 1 означает, что капуста одна на этой стороне реки, 2 означает, что гусь один на этой стороне реки и т. Д. можно было бы подумать, что это означает, что дополнение числа находится на другой стороне реки, поэтому 0 означает f на другой стороне. Тогда у вас будет инвариант thisSide + thatSide == 0xf.
По эту сторону реки есть три запрещенных штата: 3, 6, 7, где гусь ест капусту, лес - козу, или и то, и другое.Это означает, что на другой стороне есть три запрещенных состояния, 8 9 и c. Мы знаем, что 8 + 7 или 9 + 6 или c + 3 в сумме дают 0xf. Остается в общей сложности 10 разрешенных состояний. За каждым разрешенным состоянием могут следовать 1, 2 или 3 разрешенных состояния-преемника.

Правила таковы, что фермер должен переходить дорогу каждый раз в одиночку или в сопровождении одного предмета. Это эквивалентно побитовой операции XOR 8 9 a или c; если у вас есть переменные thisSide и thatSide, то одна и та же операция должна быть применена к обеим сторонам, чтобы сохранить инвариант класса.Также вы удаляете из результатов любое из шести запрещенных состояний.
Вы можете вернуть состояния обратно на английский с помощью побитового И: private final int FARMER = 8, WOLF = 4, GOOSE = 2, CABBAGE = 1; . . . . если (состояние и ФЕРМЕР> 0) outputString + = "фермер"; если (состояние & WOLF> 0) outputString + = "волк"; и т.д.

Затем вы получаете дерево, начинающееся с f, и затем вы выполняете поиск дерева, пока не найдете в нем 0. Для достижения 0 требуется ровно 7 операций, первая из которых - состояние ^ = FARMER + GOOSE;

*********************************************** ***************************
В LISP он читает что-то вроде этого, предполагая, что ваш алгоритм поиска по ширине и оператор -> уже поставлено: (defparameter * farmer * '((fwgcR wcRfg) (fwgRc wRfgc gRfwc) (fwcRg wcRfg wRfgc cRfwg) (fgcRw gRfwc cRfwg) (fgRwc gRfwc Rfwgc) (wcRfg fwcRg fwgcR) (gRfwc fgRwc fwgRc fwcRg) (cRfwg fwcRg fgcRw) (wRfgc fwgRc fwcRg) (Rfwgc fgRwc))) (defun farmer-lmg (состояние) (-> * фермер * штат)) (width-search 'fwgcR' Rfwgc # 'farmer-lmg) Аббревиатуры (очевидно) означают фермерскую волчью гусиную капусту и РЕКУ; те, кто до R, находятся на этой стороне, а те, что после R, находятся на этой стороне.Бит defun создает генератор легального хода (LMG).
*********************************************** **************************
С предоставленными нами утилитами LISP он работает, но, кажется, всегда дает мне один и тот же ответ . Я думаю, есть 4 возможных решения, но первая операция всегда заключается в том, что фермер переносит гуся, а четвертая операция всегда возвращает гуся.

[править] Незначительные орфографические исправления и значение lmg [/ править]
[30 ноября 2007 г .: Сообщение отредактировал: Кэмпбелл Ричи]

.Головоломка для перехода через реку

- Начало работы с основными транспортными проблемами, такими как Волк, Капуста, Коза, с C # или F #

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технол
.

Человек, коза, волк и капуста

Загадка:
Шел человек с козой, волком и капустой на рынок, и ему нужно было перейти реку. Его лодка могла нести только две вещи (включая его самого). Его проблема заключалась в том, что если он сначала возьмет капусту, то волк съест козу. Но если он взял волка и оставил козу и капусту, то коза съела бы ее. Как он переправил всех троих через реку, не оставив никого из них?

Ответ:
Сначала он взял козу, потому что знал, что волк не будет есть капусту.Затем он схватил волка, но на обратном пути он взял с собой козу. Он сбросил козу, взял кочаны и оставил их волку, а затем вернулся и велел козе принести его.
Показать ответ Скрыть ответ ПОДЕЛИТЬСЯ Человек, коза, волк и капуста Загадка мем с загадкой и ссылкой на страницу ответа. .Алгоритм

- Фермер, волк, коза и капуста Поиск в ширину и в глубину в Java

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант
.

Prolog - Волчья козья капуста

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Набрать т
.

Решение проблемы волчьей козьей капусты с помощью F # - статьи TechNet - США (английский)

Я изучаю язык F #. В рамках этого путешествия я решил написать решение проблемы волка, козы и капусты на F #.

Было немного сложно начать, потому что я просто не мог мыслить в терминах функционального программирования и F #. Эти две статьи помогли мне начать работу

http://www.paulbutcher.com/2007/09/escape-from-zurg/
http://web.engr.oregonstate.edu/~erwig/papers/Zurg_JFP04.pdf

Мне тоже было трудно прочитать эти две статьи, потому что они написаны на Ruby и Haskell, но я получил общее представление о том, как построить решение таких проблем.

Моим первым шагом было составить список элементов, которые необходимо переместить с левого берега реки на правый, а также констант

1. let Items = [ «Волк» ; «Коза» ; «Капуста» ]

2.

3. let DeadlyCombinations = [ установить [ «Волк» ; «Коза» ]; комплект [ «Коза» ; «Капуста» ];]


Здесь Items - это просто список с 3 строками. DeadlyCombinations - это также список, состоящий из двух наборов. Эти наборы определяют предметы / животных, которых нельзя оставлять одних ни на одном берегу.

Нам также нужна функция для проверки, принадлежит ли список смертельным комбинациям или нет. для этого напишем следующую функцию

1. let isMoveDeadly list1 =

2. пусть listSet = комплект list1

3. List.exists (fun n -> n = listSet) DeadlyCombinations


Затем мне нужна логика для перемещения Предмета из левого берега в правый.для этого я написал метод MoveRight (означает перемещение объекта с левого берега на правый берег).

01. let rec MoveRight items =

02. сопоставить предметы с

03. | [] -> []

04. | голова :: хвост ->

05. если (isMoveDeadly tail), затем

06. MoveRight tail @ [голова]

07. еще

08. Console.WriteLine ( "Идет для перемещения » + головка)

09. хвост


здесь MoveRight - это имя функции. rec означает, что эта функция будет вызываться рекурсивно, и она принимает животных в качестве параметра.здесь вы можете видеть, что F # автоматически определяет тип животных, для которых я использую логику сопоставления. Тип, который для животных предполагается List.

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

Мы намерены двигать головой, только если хвост не смертельный. в противном случае нам нужно выбрать другой элемент из списка.

Итак, мы выбираем голову из списка и проверяем, является ли хвост смертельным.Если да, мы помещаем голову в конец списка, а затем рекурсивно вызываем функцию снова, чтобы второй элемент был выбран как голова.

Если хвост не смертельный, то мы эффективно переместили головной элемент с левого берега на правый.

Поскольку один элемент перемещается из левого берега в правый, мы возвращаем оставшийся список в качестве вывода.

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

01. пусть MoveLeft животные =

02. let RightList = ListDiff animals Животные

03. let ShouldTakeAnimal = isMoveDeadly RightList

04. если (ShouldTakeAnimal), затем

05. let x = List.head RightList

06. Консоль.WriteLine ( "Переход к переместить " + x + " назад " )

07. [x]

08. еще

09. Console.WriteLine ( "Фермер идет только назад " )

10. []


Когда предмет перемещается с левого берега на правый, фермер должен вернуться, чтобы переместить следующий предмет с левого берега на правый.но это не так просто, потому что если фермер покидает правый берег и комбинация там смертельна, то предметы будет уничтожен. Итак, нам нужно определить, может ли фермер уйти с правого берега на левый в одиночку ... или он должен взять с собой какой-то предмет.

Для этого мы пишем нашу функцию MoveLeft (перемещаемся с правого берега реки на левый)

Поскольку мы не создаем второй список для элементов на правом берегу реки, нам нужно взять разницу между основным списком элементов на top с текущим списком элементов на левом берегу, чтобы получить список элементов на правом берегу.Это делается с помощью следующих функция, которая используется в функции MoveLeft выше

1. let ListDiff list1 list2 = List.filter (fun n -> List.forall (fun x -> x <> n) список1) список2


Первый оператор if определяет, может ли фермер уйти один или он должен переместить предмет с правого берега на левый. это делается путем определения того, смертельна ли комбинация на правом берегу реки. если да, то фермер не может путешествовать один, и он должен взять с собой предмет.Если комбинация не смертельна, то фермер может путешествовать один.

Имея все эти функции, мы можем написать главную функцию, которая решит головоломку. Основная функция должна продолжать перемещать фермера между левым и правым берегами, рекурсивно вызывая себя, пока загадка не будет решена. Моя основная функция выглядит как

01. let rec Решить направление животные =

02. сопоставьте животных с

03. | [] -> Console.WriteLine ( "Решено" )

04. | _ ->

05. направление совпадения с

06. | Влево -> Решить вправо (Перемещение животных вправо)

07. | Вправо -> Решить влево (животные @ (MoveLeft animals))


Здесь Solve - это рекурсивная функция, которая принимает два параметра: один - направление, а другой - список животных на левом берегу.Начнем с передачи всего списка элементов в качестве параметра.

Нам нужно создать размеченное направление с довольно простым

1. тип Направление =

2. | Левый

3. | Правый


Логика функции решения следующая.
если список животных слева пуст, загадка решена. если нет, то проверьте, где находится фермер, если фермер слева, затем переместите животное с левого берега на правый, вызвав MoveRight, и если фермер находится на правом берегу, затем вызовите функцию MoveLeft.(функция moveleft либо переместит фермера обратно на левый берег в одиночку ... или с животным, если комбинация окажется смертельной).

Наконец, мы вызываем нашу главную функцию в основном методе

1. []

2. let main args =

3. Решить левые животные

4. 0


Результат программы:

Этот пример был хорош, потому что он заставил меня подумать о
. 1.сопоставление с образцом
2. рекурсивное сокращение входного набора с помощью head :: tail
3. Разбиение ограничений задачи на мелкие функции.

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

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

открытая система

(*

Направление типа определяет, в каком направлении человек это подарок.

Слева означает, что Человек это присутствует на левой стороне берега.

Право означает человека это присутствует на правой стороне банка.

*)

тип Направление =

| Левый

| Правый

(*

Главный список животных

*)

let Животные = [ «Волк» ; «Коза» ; «Капуста» ]

let DeadlyCombinations = [ установить [ «Волк» ; «Коза» ]; комплект [ «Коза» ; «Капуста» ];]

пусть isMoveDeadly list1 =

пусть listSet = комплект list1

Список.существует (весело n -> n = listSet) DeadlyCombinations

let rec MoveRight animals =

соответствие животных с

| [] -> []

| голова :: хвост ->

если (isMoveDeadly tail), затем

MoveRight хвост @ [голова]

еще

Консоль.WriteLine ( «Собираюсь переехать» + головка)

хвост

let ListDiff list1 list2 = List.filter (fun n -> List.forall (fun x -> x <> n) list1) list2

пусть MoveLeft животные =

let RightList = ListDiff animals Животные

let ShouldTakeAnimal = isMoveDeadly RightList

если (ShouldTakeAnimal), затем

пусть x = List.голова RightList

Console.WriteLine ( «Собираюсь переехать» + x + "задний" )

[x]

еще

Console.WriteLine ( «Фермер возвращается один» )

[]

let rec Решить направление животные =

сопоставьте животных с

| [] -> Консоль.WriteLine ( «Решено» )

| _ ->

направление совпадения с

| Влево -> Решить вправо (Перемещение животных вправо)

| Вправо -> Решить влево (животные @ (MoveLeft animals))

[<точка входа>]

let main args =

Решить левых животных

0


.

Смотрите также


Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.



Понравился рецепт? Подпишись на RSS! Подписаться!