野人和传教士渡河问题是计算机算法的入门课。河的左岸有三个野人和三个传教士,他们都要过河到达右岸,只有一个船,没有船夫,最多可以容纳两个人。任何一岸野人的数目都不能多余传教士的数目。求所有渡河方案。
此问题可以抽象为图搜索问题。可以用深度优先搜索来做。图里的每一个结点代表了一个状态。从一个状态出发,每次通过可达状态最后到达最后状态,可以有几种走法。当然最优解就是最短路径。
本问题的状态应该如何描述呢?
我们可以把原先岸上的野人和传教士数目,和船停靠的位置作为状态参数,(3,3,0)表示原来左边岸上有3个传教士,3个野人,0表示船在左岸。最后我们要到达的状态是(0,0,1)野人和传教士都已经过河。
那么怎么求这一状态之后的可能状态呢?
每次可以渡过一个或者两个人,并且要使两边传教士人数多于野人人数。分别用i,j,k代表左岸传教士人数,野人人数,和船在哪里。
(i,j,k)如果k=0,下一个状态可能是(i-1,j,1)(i-2,j,1),(i,j-1,1),(i,j-2,1)(i-1,j-1,1)并且i'>j',3-i'>3-j'
如果k=1则下一状态可能是(i+1,j,0)(i+1,j+1,0)(i,j+1,0)(i,j+2,0)(i+2,j,0)
采用递归深度搜索,每次去掉已经经过的状态,直到最后状态.
注意每次递归调用之后都要回溯,以找到所有可行解
以下为java源码ÿ