汉诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。

首先我们考虑2个圆盘的情况

void movehan(int n,char a,char b,char c)
{
    if(n==1)
    {
        printf("1:%c->%c\n",a,c);  //step1
    }
    else
    {
        movehan(n-1,a,c,b);  //step2
        printf("%d:%c->%c\n",n,a,c);  //step3
        movehan(n-1,b,a,c);  //step4
    }
}

第一步 执行step2,让第一块从a移动到b。

第二布 执行step3,让第二块也就是最后一块从a移动到c。

第三步 执行step4,让第一块从b移动到c,此时任务完成。

 

3个圆盘的情况

如图

第一步 执行step2,借助c将n-1块从a移动到b(参考2个圆盘的情况)。

第二步 执行step3,将第n块从a移动到c。

第二步 执行step4,将n-1块从b移动到c,完成任务。

 

综上 汉诺塔问题都可以看成2个圆盘的问题,将n-1作为一块,第n块作为一块去处理。

 

类似的oj问题 4147:汉诺塔问题(Hanoi)  http://bailian.openjudge.cn/practice/4147?lang=en_US

 

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
void movehan(int n,char a,char b,char c)
{
    if(n==1)
    {
        printf("1:%c->%c\n",a,c);
    }
    else
    {
        movehan(n-1,a,c,b);
        printf("%d:%c->%c\n",n,a,c);
        movehan(n-1,b,a,c);
    }
}
int main()
{
    int n;
    char a,b,c;
    while(cin>>n>>a>>b>>c){
    movehan(n,a,b,c);
    }
    return 0;
}

时间复杂度:

T(1)=O(1)

T(n)=2T(n-1)+O(1)

令S(n)=T(n)+O(1)

S(1)=O(2)

S(2)=2*S(n-1)

.

S(n)=2^(n-1)*s(1)

      =2^n

所以时间复杂度 O(2^n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值