Логическая задача.Миссионеры и Каннибалы - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый день. Помогите пожалуйста написать алгоритм данной задачи: Три миссионера и три каннибала должны пересечь реку в лодке, в которой могут поместиться только двое. Миссионеры должны соблюдать осторожность, чтобы каннибалы не получили на каком-либо берегу численное преимущество. Как переплыть реку? Возможная последовательность:

Решение задачи: «Логическая задача.Миссионеры и Каннибалы»

textual
Листинг программы
  1. (defun make-state (b m k) (list b m k))
  2. (defun b-state (state)(nth 0 state))
  3. (defun m-state (state)(nth 1 state))
  4. (defun k-state (state)(nth 2 state))
  5.  
  6. (defun nextstate (state dm dk)
  7. (safe (make-state  
  8.        (- (b-state state))
  9.        (+ (m-state state) (* (b-state state) dm))
  10.        (+ (k-state state) (* (b-state state) dk))
  11.        )
  12. ))      
  13.  
  14. (defun safe (state)
  15. (cond
  16.     ((> (m-state state) 3) nil)
  17.     ((< (m-state state) 0) nil)          
  18.     ((> (k-state state) 3) nil)
  19.     ((< (k-state state) 0) nil)
  20.     ((and (> (m-state state) 0)(< (m-state state) (k-state state))) nil)
  21.     ((and (> (- 3 (m-state state)) 0)(< (- 3 (m-state state)) (- 3 (k-state state)))) nil)
  22.     (t state)
  23.  ))
  24.  
  25.  
  26. (defun path (state goal been-list)
  27. (cond ((null state) nil)
  28. ((equal state goal) (cons state been-list))
  29. ((not (member-lis state been-list ))
  30. (or (path (nextstate state 1 1) goal (cons state been-list))
  31. (path (nextstate state 1 0) goal (cons state been-list))
  32. (path (nextstate state 2 0) goal (cons state been-list))
  33. (path (nextstate state 0 2) goal (cons state been-list))    
  34. (path (nextstate state 0 1) goal (cons state been-list))
  35.  ))))
  36.  
  37. (defun member-lis (x lis)
  38. (cond ((null lis) nil)
  39. ((equal x (car lis)) t)
  40. (t (member-lis x (cdr lis)))))
  41.  
  42. (defun way (state goal) (path goal state nil))
  43.  
  44. (print (way '(-1 3 3) '(1 0 0)) )

Объяснение кода листинга программы

В представленном коде реализована простая модель для игры в «Миссионеры и Каннибалы» (Missionaries and Cannibals). В этой игре миссионеры (Missionaries) и каннибалы (Cannibals) находятся на двух островах, и их численность меняется в зависимости от того, кого они едят. Миссионеры могут перейти на другой остров, если на нем есть свободные места, и каннибалы не против этого. Код состоит из нескольких функций:

  1. make-state создает состояние, представленное в виде списка, содержащего численность миссионеров, каннибалов и общее количество людей на острове.
  2. b-state, m-state и k-state возвращают соответствующие значения из состояния.
  3. nextstate генерирует следующее состояние, учитывая текущее состояние и добавление или вычитание миссионеров и каннибалов.
  4. safe проверяет, является ли текущее состояние допустимым (то есть не содержит отрицательного количества людей или не содержит больше трех миссионеров или каннибалов).
  5. path генерирует путь из начального состояния к целевому состоянию, используя алгоритм поиска в глубину.
  6. member-lis проверяет, содержится ли элемент в списке.
  7. way вызывает функцию path, чтобы сгенерировать путь от целевого состояния к начальному состоянию.
  8. print используется для вывода пути. Пример вызова функции way в конце кода демонстрирует, как можно использовать функцию для генерации пути от состояния '(-1 3 3)' к состоянию '(1 0 0)'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.538 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут