汉诺塔问题

汉诺塔问题:

是一个经典的问题。
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

思路

n个圆盘从A移动到C,可以把B看成缓冲区,要想完成移动,必须先把上面n-1个移动到B,再把最后一个移动到C,最后把B上的n-1个移动到C,分解成三步骤:
1)先把上面n-1个移动到B;
2)再把第n个移动到C;
3)最后把B上的n-1个移动到C上;
假设有1个直接移动到C;
有两个:最上的第一个移动到B,第二个移动到C,在把第一个移动到C;
有三个:A->C,A->B,C->B(最上两个在缓冲区,n-1个),A->C(最下到达最终位置,第n个),B->A,B->C(第二个到达最终位置),A->C(第一个到达最终位置),结束。
抽象一下,以上情况均满足三个步骤。
写成递归就是 H(n) = H(n-1) + 1 + H(n-1) = 2* H(n-1) + 1
归纳法:
1)当n=1的时候,H(1)=1
2)当n=m的时候 H(m) = 2* H(m-1) + 1
3)当n=m+1的时候, m个都先放在缓冲区是H(m),移动最底下到C是1,最后移动缓冲区到C是H(m),满足H(n) = 2* H(n-1) + 1,所以成立。

另外:由H(n) = 2* H(n-1) + 1可以得到H(n) + 1 = 2*(H(n-1) + 1) 等比数列,所以H(n)=2^n

#include <bits/stdc++.h>
using namespace std;
void move(int n,char _from,char buffer,char to){
    if(n==1){
        cout<<"Move "<<n<<" from "<<_from<<" to " <<to<<endl;
    }else{
        move(n-1,_from,to,buffer);
        move(1,_from,buffer,to);
        move(n-1,buffer,_from,to);
    }
}

int main()
{
    int n;
    cin >> n;

    move(n,'a', 'b', 'c');
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值