一、汉诺塔问题
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
#include<bits/stdc++.h>
using namespace std;
void h(int n,char a,char b,char c)//第一个(a)是出发点,第二个(b)是帮助点,第三(c)个是目标点。
{
if(n==1)
cout<<n<<":"<<a<<"->"<<c<<endl;
else
{
h(n-1,a,c,b);//从a点出发,借助b,到c。
cout<<n<<":"<<a<<"->"<<c<<endl;
h(n-1,b,a,c);
}
}
int main()
{
int n;
char X,Y,Z;//X是出发,Y是目标,Z是帮助。
cin>>n>>X>>Y>>Z;
h(n,X,Y,Z);
return 0;
}
附图:
本题思路:在正式讲解汉诺塔问题之前,最好自己去玩一玩,看能不能找出其中的规律,如果五个圆盘玩不了,那就那叠三个圆盘来玩一玩,总之,一定要去玩一玩,并试着去找出规律,才会理解下面是在讲什么。如果只有一个盘子的话,那就直接输出移的过程。
if(n==1)
cout<<n<<":"<<a<<"->"<<c<<endl;
如果不是,那就首先将n-1个盘子挪开,给n号盘(最大盘)移出位置,再让 n移到目标点,再将n-1个盘子移到n之上。
else
{
h(n-1,a,c,b);
cout<<n<<":"<<a<<"->"<<c<<endl;
h(n-1,b,a,c);
}
重复此操作,逐步缩小问题的范围。将这个思路制成一个函数,在递归里调用这个函数。
在主函数里,就可以直接调用函数了。
h(n,X,Y,Z);