{hanoi塔大集合}hdoj的汉诺塔问题

普通汉诺塔

H(1)=1;

H(n)=H(n-1)+1+H(n-1)=2*H(n-1)+1;//将最顶层n-1个移至B柱子,把最大的移至C,再把n-1个移至C

解得通项H(n)=2^n-1;


汉诺塔2 hdoj1207

经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。Gardon就收到了一个汉诺塔玩具作为生日礼物。 
  Gardon是个怕麻烦的人(恩,就是爱偷懒的人),很显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以Gardon决定作个小弊,他又找来了一根一模一样的柱子,通过这个柱子来更快的把所有的盘子移到第三个柱子上。下面的问题就是:当Gardon在一次游戏中使用了N个盘子时,他需要多少次移动才能把他们都移到第三个柱子上?很显然,在没有第四个柱子时,问题的解是2^N-1,但现在有了这个柱子的帮助,又该是多少呢?


同样规定N个盘子对应答案H(n)

分析一下 相当于把当前的汉诺塔分成三部分:第一部分(去B柱子),第二部分(去C柱子),最大那块(直接去D)

第一部分去B时有两根过渡柱子(C\D),假设这一部分有x个圆盘,移动数目便为H(x)(H(n)为“借助B/C将n个圆盘移到D的步骤数”,同理等于“借助C\D将n个圆盘移到B的步骤数”),递归可解。

第二部分去C时只有一根过渡柱子(D,因为B已经被占领),因此回归普通汉诺塔问题,移动数目为2^y-1(假设这部分y个圆盘,并且y+x=n-1)

最大那块移过D去有一个步骤。

最后再把第二部分移到D

把第一部分移到D

综上H(n)=min{2*(H(x)+2^y-1)}+1;其中(x+y=n-1,x,y<n-1)

或者F(n)=min(2*F(n-r)+2^r-1),(1≤r≤n)。

通过这个方程我们能得到所有4柱汉诺塔的步骤个数,同时也有人证明[1]了,对于四柱汉诺塔,当r=(sqrt(8*n+1)-1)/2时,能保证f(n)取得最小值F(n)=(n-(r^2-r+2)/2)*2^r+1。所以算法的复杂度是F(n)=O(sqrt(2*n)*2^ sqrt(2*n))。从这这个方程中也可以看出,在n<6的时候,我们可以验证是和我们起初的构想的结构是相同的,但是当n再增多时就不是当初想的那样了。

//1.《四柱汉诺塔之初步探究》杨楷 </

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值