关于微软面试题:"四人过桥"问题的思考——“n人过桥”问题的演进(Java实现)

前段时间,在CSDN上无意中看到有人发表了一道微软面试题——“4人过桥”问题的算法,只是一直忙于手头上的工作,没有能够在短期实现。当时就是想,如果把这个问题用计算机语言实现的话,有些多此一举,即使我们用穷举法,也只不过是18种情况。所以就没有深入思考,一直没有用Java来实现具体代码。

 

问题是这样的:

问题:四人夜过桥,步行时间分别为 1、2、5、10 分钟,四人只有一台手电筒,一趟最多两人过桥,一趟过桥须持手电筒,时间以最慢者计,问 17 分钟内可否过桥,如何过桥?

 

(仅仅针对4人过桥,可以参考http://blog.csdn.net/hikaliv/archive/2009/08/24/4479956.aspx

 

今天无意中想起递归算法,突生灵感,如果用Java语言实现“n人过桥”问题,那就有意思了。

递归的出口是:“2人过桥”情况。2人过桥,不需要有人返回,所以非常简单,总时间就是单人所需时间中的最大值。

如果是“n人过桥”(n>=3),那完全可以递归了。

假设是从桥头A至桥头B,桥头A的人群为一个集合,桥头B的人群为另一个集合。

那么首先可以从A中任意选择2个人从A到B;则A集合中减少2个人,B集合中增加2个人;

然后需要一个人从B返回A,这个可以分析出如果想要比较少的时间,一定是从B中选一个单独需时最短的;此时B中减少一个人,A集合中增加一个人;

之后情况变成了“n-1人过桥”问题。

递归思想就开始起作用了。

 

但是需要注意一点,我在这里的思想是每次返回的人都是从B集合

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值