你知道river-crossing problems下面是排序说明:
从前,三个食人族正在引导三个传教士穿过丛林。他们正在去最近的任务站的路上。过了一段时间,他们来到一条宽阔的河里,河里满是致命的蛇和鱼。没有船是无法过河的。幸运的是,经过短暂的搜寻,他们找到了一艘双桨划船。不幸的是,船太小了,载不下他们所有人。一次只能载两个人。更糟的是,由于河的宽度,除了划船,没有办法把船带回来。
由于传教士不能相信食人族,他们不得不想出一个计划,让他们六个人安全过河问题是,这些食人者一旦在某个地方食人者比传教士多,就会杀死并吃掉传教士因此,我们的传教士程序员必须设计一个计划,以保证在河的两边从来没有少数传教士。不过,可以相信食人族会以其他方式合作。具体来说,他们不会放弃任何潜在的食物,就像传教士不会放弃任何潜在的皈依者一样。
我的问题是这个问题的一部分我正在尝试设计一个函数,它返回可能的船载列表(例如,如果船载容量是3,则[(3m is,0can),(2mis,1can),(1mis,1can),…])。我有num(传教士或食人族的数量)和船容量作为我的功能输入。
你如何设计你的函数和算法?
最佳答案
以递归的方式考虑这个问题,也就是说,你想用可能的子问题来考虑它。所以,如果你有一艘船上有三个乘客,那显然就像一艘船上有一个乘客,加上两个乘客的组合。
有两个居住者的船有一个居住者加上“满船一个居住者”。
所以你的算法基本上是
to find all combinations of n occupants,
pick an occupant
if n = 1 return
if n > 1 find all combinations of (n-1) occupants.
注意,这不是确切的解决方案,因为这看起来很像一个家庭作业问题。