我需要一些教授给我们的数学任务的帮助。任何建议都会有帮助。 问题是:
有N个食人族和M个嫌疑人。所有传教士都有一个强度属性,可以是1或任何正整数。 Strenght表示他可以对抗多少食人族。
基本上:河的两边有一个2槽的船,你必须将所有人转移到另一边,而不让食人族吃传教士。
你会如何为此编写程序?什么是转移分组的algorythm?
感谢您的期待,
标记。
答案 0 :(得分:1)
将问题建模为状态graph。
在这里,状态是({L,R} n ,{L,R} m ,{L,R})其中:
n
条目:每个传教士一个 - 他在哪里:左/右河岸m
条目:每个canibal一个 - 他在哪里:左/右河岸这些是你的顶点 - 你还应该修剪无效状态 - 传教士的力量在一个(或多个)方面是不够的。每个州很容易计算出来。
你的边缘是:
E = { (S1,S2) | Can move in one boat ride from S1 to S2 }
所有剩下的工作 - 使用一些shortest path algorithm来查找从(L,L,....,L)
到(R,R,...,R)
的最短路径。
您可以使用BFS执行此任务,甚至bi-directional search - 或使用明智的算法(使用admissible heuristic),例如A* Algorithm。
PS。 'graph'只是概念性的,实际上你会有一个函数next:S->2^S
,给定一个状态 - 返回这个状态的所有有效后继者(声明你可以使用{{{{{{ 1}})。这将允许您“动态生成图表”。
你的S
函数应该是(高级伪代码,没有优化):
next(S)