有三根杆子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
所以时间复杂度