Как перевезти на лодке волка козу и капусту
Перейти к содержимому

Как перевезти на лодке волка козу и капусту

  • автор:

Старинная задача

zadacha.jpg

Уже в первом классе ребенку задали такую задачку

Некий человек должен был перевезти в лодке через реку волка, козу и капусту. В лодке мог поместиться только один человек, а с ним или волк, или коза, или капуста. Но если оставить волка с козой без человека, то волк съест козу, если оставить козу с капустой, то коза съест капусту, а в присутствии человека «никто никого не ел». Человек все-таки перевез свой груз через реку.
Как он это сделал?

Ответ:

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

Комментарии

какая то знакомая

задача, вроде слышала уже. но чтобы в 1 классе, может у детей сечас логическое мышление мутирует. такое продвиутое. Фифа Павлик сам решает. или вместе думаете.

продвинутое мышление

Оленька, да не говори, «мышление мутирует» страшными темпами
Вчера, значит, на родительском собрании дали примеры заданий конкурса «Почемучка» с прошлых лет. Дала ему порешать и начала проверять.

Задание:
У Саши было 9 палочек. Он разломал 2 из них пополам. Сколько палочек стало у Саши?
А-7, Б-11, В-13.

Ну я со своим высшим образованием сосчитала, что палочек стало 7, а ребенок утверждает что палочек стало 11.

Минут 5 я сначала вникала, что до меня хотят донести. Потом поняла Но все равно был тупик какой же ответ выбрать. Пришлось звать папу. Он тоже у нас с высшем образованием :bigsmile:
В результате, на семейном совете решили, что все-таки ребенок прав.

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

3 мандарина можно обменять на 2 лимона, а 3 лимона можно обменять на 4 яблока. Сколько мандаринов можно обменять на 16 яблок?
Эту задачку пришлось объяснить.

Перевозим волка, козу и капусту через реку без эффектов на Elixir

Становится уже доброй традицией — все любопытное, что появилось на Хаскеле — повторять на Эликсире.

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

Постановка задачи (благодарно скопипащщено из оригинальной заметки):

Волк → Коза → Капуста

Мы будем действовать следующим образом: начнем с состояния «все на левом берегу», и на каждом шаге будем запускать максимум столько эрланг-процессов, сколько на этом берегу живности (+1 для ходки порожняком). При этом мы всегда будем проверять, что остающаяся на берегу живность — друг друга не перегрызет, и эти ветки будем отсекать сразу. Также мы будем хранить историю, и отсекать циклические ветки, возвращающие нас в уже виденное состояние. Это, кстати, не избыточные данные — историю поездок мы будем возвращать в качестве результата.

Итак, начнем с объявлений.

Поскольку парсер Хабра все еще живет в XIX веке, вот вам картинка с начальными значениями.

Начальные значения

Что ж, можно и перейти к собственно написанию кода.

Проверка целостности

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

Ход (лодкой)

Условия для порожней ходки, и ходки с живностью довольно сильно различаются, поэтому удобно их обработку разбить на две функции ( nil отлично подходит в качестве «никого»).

Собственно партия (многоходовочка)

Осталось, собственно, написать основную часть: рекурсивный запуск процессов. Нет ничего проще.

Спасибо Stream , весь этот код ленив, сиречь выполняться не будет, пока не пнут. Мы же тут хаскель пародируем, помните?

Проверяем

Тесты я недолюбливаю и считаю пустой тратой времени: гораздо проще сразу писать рабочий код. Поэтому я просто создам функцию main/0 и выведу результаты на экран.

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

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

Словесный способ алгоритма решения задачи 1:

вернуться к волку и капусте

перевезти волка к козе

перевезти козу к капусте

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

Словесный способ не имеет широкого распространения в информатике:

такие описания строго не формализуемы;

страдают многословностью записей;

допускают неоднозначность толкования отдельных предписаний.

Словесно-формульный способ записи алгоритмов использует ограниченный набор слов и математические формулы. Алгоритм разбивается на шаги, т.е. структурируется. Его часто называют структурированным или пошаговым.

Рассмотрим этот способ записи алгоритма на примере нахождения действительных корней полного квадратного уравнения:

Задача 2. Решить квадратное уравнение: a·x 2 +b·x + c = 0.

Исходными данными для алгоритма являются коэффициенты a, b, с. Причем a≠0 и b≠0. Результат: два или ни одного действительных корней.

Словесно-формульный способ записи задачи 2:

1) Задать (численные значения коэффициентов) a, b, c.

2) Вычислить (дискриминант): .

3) Если D≥0, то вычислить (действительные корни по формулам)

Иначе «Записать ответ: нет действительных корней».

4) Закончить решение.

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

Одним из его недостатков является то, что для сложных задач трудно увидеть структуру алгоритма (нет наглядности). Этот недостаток преодолен в графическом (блок-схемном) способе описания алгоритма. Рассмотрим его.

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

Блок схемы читаются сверху вниз и слева направо. Блок-схемы полезны тем, что обеспечивают легкую «читаемость» алгоритма. Они, как и любые схемы, наглядны.

Однако это не всегда так: стоит попытаться нарисовать блок-схему для более-менее сложного алгоритма, как она разрастается до невероятных размеров и теряет все свое наглядное преимущество. Поэтому блок-схемы хороши в структурном программировании для описания коротких алгоритмов. Язык блок-схем прост (хотя существуют его расширенные варианты):

Блок вычислений (вычислительный блок)

Вычислительные действия или последовательность действий

Логический блок (блок условия)

Выбор направления выполнения алгоритма в зависимости от некоторого условия

Блок ввода-вывода данных

Общее обозначения ввода (вывода) данных (вне зависимости от физического носителя)

Начало или конец алгоритма, вход или выход в подпрограмме

Процесс пользователя (подпрограмма)

Вычисление по стандартной программе или подпрограмме

Функция выполняет действия, изменяющие пункты (например, заголовок цикла) алгоритма

Переход к следующему блоку

Вывод: Алгоритмизация — один из основных этапов решения задач с помощью компьютера. Понятие алгоритма является достаточно «молодым» и дополняется по мере использования его в сфере информационных технологий и программирования, не смотря на то, что в математике оно было известно еще до нашей эры. При описании свойств алгоритма разные авторы используют множество подходов и классификаций. Мы попытались обобщить их и выделить наиболее значимые: детерминированность, дискретность, конечность, массовость и результативность. Среди множества способов описания алгоритмов самым наглядным является графический метод, который реализуется с помощью блок-схемы алгоритма.

Как перевезти на лодке волка козу и капусту

ОБОСОБЛЕННЫЕ ЧЛЕНЫ ПРЕДЛОЖЕНИЯ

Запишите предложения, выделяя обособленные члены предложения (в скобках укажите – что обособленно: приложение, обстоятельство, согласованное или несогласованное определение):

1. Охотника лес кормил «звериным промыслом», земледельца – лесными угодьями и бортничеством (старейшая форма пчеловодства, при которой пчёлы живут в дуплах деревьев), ремесленника – различными ремёслами, связанными с использованием дерева.

2. Приглядевшись внимательнее, Костя увидел бюст Льва Толстого.

3. Они сидели близко, совсем рядом, и Володя не видел, куда смотрит отец, но чувствовал его серьёзный, строгий и спокойный взгляд.

4. Над крышей гордо возносился конёк – стилизованная голова лошади.

5. Отличить полезный, «настоящий» труд от мартышкиного просто: ощущаешь себя молодцом, завершив работу, или понимаешь, что занялся не своим делом.

6. Делая усилия, мы становимся частью этого пространства.

7. Впереди были горы, высокие, неприступные.

8. Я должна быть примером для младшего братишки, с детства он должен видеть, что взрослые неустанно работают, и я, старшая сестра, тружусь так же.

9. А он, сообразительный малыш, уже знает, что делать: жуёт конфету, берёт мою скрипку и начинает играть мой урок.

10. Заворожённый этим зрелищем и заколдованный своим малодушием, я замер.

11. А вечером, на закате, уставшие и притихшие, мы сидели на берегу и ждали, когда появится трамвайчик, который должен был везти нас из студёного оврага к лагерю.

12. Толик стал заядлым автомобилистом: та самая «Волга», что стояла у них в гараже, эта небесная египетская корова, определила его судьбу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *