野人和传教士渡河问题的java实现

博客介绍了如何使用深度优先搜索解决经典的野人和传教士渡河问题。问题设定为有三个野人和三个传教士需要通过一艘船从左岸到达右岸,条件是任何时候野人的数量都不能超过传教士。通过状态描述(野人、传教士数量及船的位置),利用递归进行深度优先搜索,寻找所有可能的解决方案。Java源码提供了实现细节。
摘要由CSDN通过智能技术生成

        野人和传教士渡河问题是计算机算法的入门课。河的左岸有三个野人和三个传教士,他们都要过河到达右岸,只有一个船,没有船夫,最多可以容纳两个人。任何一岸野人的数目都不能多余传教士的数目。求所有渡河方案。

       此问题可以抽象为图搜索问题。可以用深度优先搜索来做。图里的每一个结点代表了一个状态。从一个状态出发,每次通过可达状态最后到达最后状态,可以有几种走法。当然最优解就是最短路径。

      本问题的状态应该如何描述呢?

      我们可以把原先岸上的野人和传教士数目,和船停靠的位置作为状态参数,(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源码ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值