Логическая задача.Миссионеры и Каннибалы - Lisp
Формулировка задачи:
Добрый день. Помогите пожалуйста написать алгоритм данной задачи:
Три миссионера и три каннибала должны пересечь реку в лодке, в которой могут поместиться только двое. Миссионеры должны соблюдать осторожность, чтобы каннибалы не получили на каком-либо берегу численное преимущество. Как переплыть реку?
Возможная последовательность:
Решение задачи: «Логическая задача.Миссионеры и Каннибалы»
textual
Листинг программы
(defun make-state (b m k) (list b m k)) (defun b-state (state)(nth 0 state)) (defun m-state (state)(nth 1 state)) (defun k-state (state)(nth 2 state)) (defun nextstate (state dm dk) (safe (make-state (- (b-state state)) (+ (m-state state) (* (b-state state) dm)) (+ (k-state state) (* (b-state state) dk)) ) )) (defun safe (state) (cond ((> (m-state state) 3) nil) ((< (m-state state) 0) nil) ((> (k-state state) 3) nil) ((< (k-state state) 0) nil) ((and (> (m-state state) 0)(< (m-state state) (k-state state))) nil) ((and (> (- 3 (m-state state)) 0)(< (- 3 (m-state state)) (- 3 (k-state state)))) nil) (t state) )) (defun path (state goal been-list) (cond ((null state) nil) ((equal state goal) (cons state been-list)) ((not (member-lis state been-list )) (or (path (nextstate state 1 1) goal (cons state been-list)) (path (nextstate state 1 0) goal (cons state been-list)) (path (nextstate state 2 0) goal (cons state been-list)) (path (nextstate state 0 2) goal (cons state been-list)) (path (nextstate state 0 1) goal (cons state been-list)) )))) (defun member-lis (x lis) (cond ((null lis) nil) ((equal x (car lis)) t) (t (member-lis x (cdr lis))))) (defun way (state goal) (path goal state nil)) (print (way '(-1 3 3) '(1 0 0)) )
Объяснение кода листинга программы
В представленном коде реализована простая модель для игры в «Миссионеры и Каннибалы» (Missionaries and Cannibals). В этой игре миссионеры (Missionaries) и каннибалы (Cannibals) находятся на двух островах, и их численность меняется в зависимости от того, кого они едят. Миссионеры могут перейти на другой остров, если на нем есть свободные места, и каннибалы не против этого. Код состоит из нескольких функций:
make-state
создает состояние, представленное в виде списка, содержащего численность миссионеров, каннибалов и общее количество людей на острове.b-state
,m-state
иk-state
возвращают соответствующие значения из состояния.nextstate
генерирует следующее состояние, учитывая текущее состояние и добавление или вычитание миссионеров и каннибалов.safe
проверяет, является ли текущее состояние допустимым (то есть не содержит отрицательного количества людей или не содержит больше трех миссионеров или каннибалов).path
генерирует путь из начального состояния к целевому состоянию, используя алгоритм поиска в глубину.member-lis
проверяет, содержится ли элемент в списке.way
вызывает функциюpath
, чтобы сгенерировать путь от целевого состояния к начальному состоянию.print
используется для вывода пути. Пример вызова функцииway
в конце кода демонстрирует, как можно использовать функцию для генерации пути от состояния '(-1 3 3)' к состоянию '(1 0 0)'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д