汉诺塔问题简单探讨

来源:互联网 发布:暗黑3 数据库 编辑:程序博客网 时间:2024/04/27 23:54

 汉诺塔问题简单探讨
作者:HAM
    上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。
    上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
    有语言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。
    以上摘自百度百科http://baike.baidu.com/view/413199.htm
    现在有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。
    首先我们肯定是把上面n-1个盘子移动到柱子C上,然后把最大的一块放在B上,最后把C上的所有盘子移动到B上,由此我们得出表达式:
    H(1) = 1
    H(n) = 2*H(n-1)+1 (n>1)
    那么我们很快就能得到H(n)的一般式:
    H(n) = 2^n - 1 (n>0)

    并且这种方法的确是最少次数的,证明非常简单,可以尝试从2个盘子的移动开始证,你可以试试。
    进一步加深问题(解法原创*_*):
    假如现在每种大小的盘子都有两个,并且是相邻的,设盘子个数为2n,问:(1)假如不考虑相同大小盘子的上下要多少次移动,设移动次数为J(n);(2)只要保证到最后B上的相同大小盘子顺序与A上时相同,需要多少次移动,设移动次数为K(n)。
    (1)中的移动相当于是把前一个问题中的每个盘子多移动一次,也就是:
    J(n) = 2*H(n) = 2*(2^n - 1) = 2^(n+1)-2
    在分析(2)之前,我们来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次,盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。
    现在回到最开始的问题,n个盘子移动,上方的n-1个盘子总移动次数为2*H(n-1),所以上方n-1个盘子的移动次数必定为偶数次,最后一个盘子移动次数为1次。
    讨论问题(2),综上两点,可以得出,要把A上2n个盘子移动到B上,首先可以得出上方的2n-2个盘子必定移动偶数次,所以顺序不变,移动次数为:
    J(n-1) = 2^n-2
    然后再移动倒数第二个盘子,移动次数为2*J(n-1)+1 = 2^(n+1)-3,
    最后移动最底下一个盘子,所以总的移动次数为:
    K(n) = 2*(2*J(n-1)+1)+1 = 2*(2^(n+1)-3)+1 = 2^(n+2)-5

 

原创粉丝点击