hanooi汉诺塔递归问题

来源:互联网 发布:形势与政策论文 网络 编辑:程序博客网 时间:2024/04/30 02:44

汉诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

输入
输入为一个整数n和3个字符,表示有n个盘子以及3根杆的编号。(n<=10)
输出
输出每一步移动盘子的记录。一次移动占一行。
每次移动的记录为例如3:a-->b 的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1, 2, ...n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
样例输入
3 a b c
样例输出

1:a-->c
2:a-->b
1:c-->b
3:a-->c
1:b-->a
2:b-->c
1:a-->c

(以下所说的移动都是必须满足从上到下依次增大的情况)

经典的递归问题,这里说思路,先从最简单的情况开始推理,假如是两个的情况,先把第一个放到b柱子,再把第二个放到c柱子,再把b柱子上的放到c柱子即可完成。这样的话就完成了两个的情况

假如一开始有三个盘子,则我们可以怎么办呢?我们需要先把上面两个移动到B,再把第三个移动到c,再把b柱子上的两个移动到c,这样才行。已知了两个盘子从a移动到c的情况,那么只要把c换成b,再把第三个移动到c,再把b柱子上的移动到c即可。这样就是三个盘子的情况。

依次类推可以推导四个盘子的情况。


#include<iostream>
#include<iomanip>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
void hanooi(int n,char a,char b,char c)
{
 if(n)
 {
 hanooi(n-1,a,c,b);//注意这既是两个盘子的情况又是多个盘子递归的情况,所以可以先写出两个盘子的情况来递推。
      //这个函数也就是代表了从a柱子移动到b盘子
 cout<<n<<a<<"-->"<<c<<endl;
 hanooi(n-1,b,a,c);//这个函数代表了从b柱子移动到c柱子
 }
}
int main()
{
 int n;cin>>n;
 hanooi(n,'a','b','c');
}


原创粉丝点击