Каннибалы и Миссионеры с Силой
Мне нужна помощь с математическим заданием, которое наш профессор дал нам. Любые предложения помогут. Проблема в:
Есть N каннибалов и M миссинаров. Все миссионеры имеют атрибут прочности, который может быть 1 или любым положительным целым числом. Сила указывает, сколько каннибалов он может отбить.
В основном: есть две стороны реки, есть двухслотовая лодка, и вам нужно перевести всех парней на другую сторону, не позволяя людоедам съесть миссионеров.
Как бы вы написали программу для этого? Каков будет алгоритм переноса-группировки?
Спасибо в ожидании,
Отметка.
1 ответ
Смоделируйте вашу проблему как граф состояний.
Здесь состояние ({L, R}n, {L, R}m, {L, R}), где:
- Первый
n
записи: по одной на каждого миссионера - где он находится: левый / правый берег реки - следующий,
m
записи: одна для каждого canibal- где он: левый / правый берег реки - Последняя запись для лодки
Это ваши вершины - вы также должны урезать недопустимые состояния - где сила миссионеров недостаточна в одну (или более) сторону. Это легко рассчитать для каждого состояния.
Ваши края:
E = { (S1,S2) | Can move in one boat ride from S1 to S2 }
Все осталось сделать - используйте алгоритм кратчайшего пути, чтобы найти кратчайший путь из: (L,L,....,L)
в (R,R,...,R)
,
Вы можете использовать BFS для этой задачи, или даже двунаправленный поиск - или информированный алгоритм (с допустимой эвристикой), такой как алгоритм A*.
PS. "График" является просто концептуальным, на практике у вас будет функция next:S->2^S
, что задано состояние - возвращает все действительные наследники этого состояния (утверждает, что вы можете получить к ним, используя одно ребро на графике из S
). Это позволит вам "генерировать график" на лету.
Ваш next(S)
функция должна выглядеть примерно так (высокоуровневый псевдокод без оптимизации):
next(S):
let x be the bank where the boat is, and y the other bank
for each person p1 on bank x:
S' = S where boat and p1 moved from x to y
if S' is valid according to strength limitations, yield S'
for each p2 != p1 on bank x:
S' = S where boat and p1 and p2 moved from x to y
if S' is valid according to strength limitations, yield S'