问题描述:
有三柱子A,B,C,每一个柱子上都有n个大小不一的盘子,这些盘子大的在下,小的在上,如下图
![](https://img-blog.csdnimg.cn/img_convert/7494cbbf3007a140dc4d7872284161a3.png)
需要把A柱子上的所有盘子利用B柱子移动到C柱子上,但是每一次只能移动一个盘子并且在移动的过程中需要一直保持大在下。
输入要求:
输入一个正整数n代表需要移动的盘子数
输出要求:
输出移动的每一步,例如A->C
解题思路:
目的是要把A上的所有盘子转移到C上,这样就可以先把A上面的n-1个盘子从A利用C移动到B上,再把最后一个盘子从A直接移动到C上,然后把B上的n-1个盘子利用A移动到C上,图解步骤如下(以n=3演示):
a.把A上面n-1个盘子移动到B上。
![](https://img-blog.csdnimg.cn/img_convert/e74142bfc933e3d12f4e850a35f2b89f.png)
b.把A上最后一个盘子直接移动到C上。
![](https://img-blog.csdnimg.cn/img_convert/c0c2fc1dc710ee0fc1be513101471651.png)
c.此时可以把B看出A,A为空柱子可以看出B,而C上的盘子为所有盘子最大的盘子即该盘子已经到了它应该在的位置。
![](https://img-blog.csdnimg.cn/img_convert/4ef766731e5aa304d0cb722c0285d0b8.png)
a、c两步可以看成一个问题(c的规模少1),即可以利用递归来解决。
代码:
#include<iostream>
using namespace std;
//表示把start上的盘子转移到target上经过transfer
void Hanoi(int n,char start,char transfer,char target){
//当n只有1时表示只有一个盘子需要移动,直接把start上的盘子移动到target上
if(n==1){
cout<<start<<"->"<<target<<endl;
return;
}
//把start上面的n-1个盘子移动到transf上
Hanoi(n-1,start,target,transfer);
//移走start上面的n-1个盘子后,把最后一个盘子直接移动到target,并输出
cout<<start<<"->"<<target<<endl;
//把transfer上的n-1个盘子移动到target上
Hanoi(n-1,transfer,start,target);
return;
}
int main(){
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}
6.运行结果:
![](https://img-blog.csdnimg.cn/img_convert/9168abcee0ea625a40f674d7f7d5d27c.png)