作为人工智能上机课的第一题,上网看了许多算法,最后根据自己的理解写出了一种比较简单易懂的方法。下面为简单分析。
Ⅰ判断函数中判断为非法状态的情况
①任何一边船的数目不为0且不为1;
②任何一边野人或者传教士的人数小于0;
③任何一边传教士人数不为0且传教士人数小于野人人数;
④当前将要到达的状态在路程visit中出现过。
Ⅱ递归函数
这里的递归函数设置了三个形参:M,C,flag分别表示左岸传教士数、野人数和船数(受书上的提示的影响,即左岸初态为(3,3,1),终态为(0,0,0))。
对于左岸状态的变化我们知道有总共有十种可能,即:
两个野人从左岸到右岸,
两个传教士从左岸到右岸,
一个野人一个传教士从左岸到右岸,
一个野人从左岸到右岸,
一个传教士从左岸到右岸,
以及相反的五种情况。
这里博主设置了一个两层循环,以i表示本次船上载人数,j表示船上的传教士数,外层循环i从2到1(船上载0个人是没有意义的,i=0不予考虑),内层循环j从i到0。则可能情况如下所示(其中k表示船上的野人数,k = i-j):
i=2: j = 2, k = 0
j = 1, k = 1
j = 0, k = 2