算法迷题之夜过吊桥

Posted 童话的守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法迷题之夜过吊桥相关的知识,希望对你有一定的参考价值。

在漆黑的夜晚,一家四口爸爸、妈妈、女儿和奶奶,要过一座吊桥。他们手中只有一个手电筒,每次过桥都需要用手电筒照亮。爸爸独自过桥需要1分钟,妈妈需要2分钟,女儿需要5分钟,奶奶需要10分钟,每次只容两人通过,每次通过的时间以慢者为准。请问一家四口如何在17分钟内通桥?
这是道非常有意思的问题。很多人第一想到是让最快的人返回,不过这样得到的结果是10+5+2+1+1=19分钟。而实际的方案却是(1,2),(2),(10.5),(1),(1,2),时间是10+2+2+2+1=17分钟,这个方案体现的原则是让速度慢的两个人一起过河。
所以我们可以总结出:(1)让最快的人返回;(2)让慢的人搭配行走。 这两条大概的原则。
这一问题,在sillke 的网站上有很多讨论。calude与Elena给出了通用的算法但没有给出严格的证明,Gunter Rote给出了证明(很无聊的那种)。博主的水平只能写到calude与Elena这一层,至于Gunter Rote的论文大家有兴趣的可以自己google一下。
实际上,如果你想programing,遍历是一个很好的选择。对于N个人过河,可以分解为N-1次double crossing和N-2次 single crossing。如果用矩阵来表示,可以用一个2n-3 * n 的boolean矩阵来表示渡河方案,如4个人的一种方案可以表示为:
0 0 0 0
1 1 0 0
0 1 0 0
0 1 1 1
0 0 1 1
1 1 1 1
其中第一行与最后一行为初始与最终状态。对于N个人过河,我们遍历所有的2n-3 * n 的boolean矩阵,检测其是否满足相关要求(很简单的规则,奇数行的和为1,偶数为2之类的)。不过无效的矩阵数目太多了,calude的实验表明,N=4时,有效方案为0.164%;N=5时,为0.000402%。
这种穷举的算法源码我稍后会上传到我的资源中去,欢迎大家下载。
好了,我们来讨论一个一般的问题,n个过河时间不同的人的最优方案是什么,有多少种?设t1<t2<...<tn
最后的答案是(n-3)t1+t2+...+tn-2+min2*t2,t1+tn-1+tn;
理论上的最小时间是(n-2)*t1+t[n]+(n-2)*t2。n-2次single crossing,n-1次double crossing 。显然,这并不是一个解决方案内的时间。我们接下来要做的就是把这个时间一点一点的放大,直到它满足我们的一种方案。
如果single crosing不变,我们改变double crossing 方案,(n-2)*t1+t[n]+(n-3)*t2+t3,(n-2)*t1+t[n]+(n-4)*t2+t3+t4。。。(n-2)*t1+2*t2+t3+...+tn,最终形成了按原则1的方案。
当然我们也可以改变single crosing的方案,让t2多来1趟。(n-3)*t1+3*t2+t3+...+tn-2+tn,最终形成了按原则2的方案。实际上当我们面对tn,tn-1,t1三人渡河时,有两种方案t1+tn-1+tn和tn+2*t2,我们当然要选择时间最少的那种,于是就有最终答案(n-3)t1+t2+...+tn-2+min2*t2,t1+tn-1+tn。
大家的问题可能有:
1.改变single crosing的方案,为何不让t3多来1趟?显然,t2多来一趟的时间比t3的时间短。
2.t2是否可以不只来返回一次?当然可以,上文给出是tn与tn-1的替代方案,其实tn-2,tn-3还没有考虑。
3.有多少方案?(N-1)!

以上是关于算法迷题之夜过吊桥的主要内容,如果未能解决你的问题,请参考以下文章

夜过吊桥算法

算法也是很过瘾的~~用面向对象实现~夜过吊桥~算法

郁金香搜索引擎方案

郁金香搜索引擎的方案

unity自带寻路Navmesh入门教程

有一种爱叫做东方不败