有实力的食人族和传教士

时间:2013-10-10 15:30:55

标签: c algorithm river-crossing-puzzle

我需要一些教授给我们的数学任务的帮助。任何建议都会有帮助。 问题是:

有N个食人族和M个嫌疑人。所有传教士都有一个强度属性,可以是1或任何正整数。 Strenght表示他可以对抗多少食人族。

基本上:河的两边有一个2槽的船,你必须将所有人转移到另一边,而不让食人族吃传教士。

你会如何为此编写程序?什么是转移分组的algorythm?

感谢您的期待,

标记。

1 个答案:

答案 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)