【问题描述】
古代有一个梵塔,塔内有3个座位A,B,C,开始时A座上有m个盘子,盘子的大小不等,大的在下,小的在上,有一个老和尚想把这m个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动的过程中可以利用B座。请用子函数的形式模拟汉诺塔的移动过程。
【输入形式】
输入盘子的数量m,(10≥m≥2)
【输出形式】
输出盘子移动的步骤
【样例输入】
2
【样例输出】
A–>B
A–>C
B–>C
【样例说明】先将A上的一个盘子移动到B上,再将A上剩下的那个盘子移动到C上,最后将B上的盘子移动到C上,保持了小盘在上,大盘在下。
参考主程序代码:
int main()
{
int number;
cin >> number;
Hanoi(number);
return 0;
}
思路(递归):无论有多少盘子都可分为两部分移动,即将最后一个盘子移动到目标座位和前面所有盘子移动到借助座位再移动到目标座位
假设有n个盘子
1、把n-1个盘子从起点盘移动到(当前)没有任何盘子的借助座位
2、把最后一个盘子从起点座位移动到目标座位
3、把n-1个盘子从借助座位移动到目标座位(模仿1和2的操作方法来实现)
#include<iostream>
using namespace std;
int main() //主函数
{
int Hanoi(int x);
int number;
cin>>number;
Hanoi(number);
return 0;
}
int Hanoi(int x) //定义汉诺塔函数
{
void move(int x,char a,char b,char c); //移动函数的声明
move(x,'A','B','C'); //函数移动
return 0;
}
void move(int x,char a,char b,char c) //定义移动函数
{
//x表明盘子数,a表示起始的盘子处于的座位,b表示借助座位,c表示目标座位
if(x==1) cout<<a<<"-->"<<c<<endl;
//当盘子数为1时,直接从初始座位移至目标座位
else //盘子数不为1时
{
move(x-1,a,c,b); //先将前x-1个盘子移动到借助座位
//此时为将盘子移至借助座位,所以借助座位变为目标座位
//而利用最终的目标座位进行移动,所以最终的目标座位变为借助座位
cout<<a<<"-->"<<c<<endl; //将最后一个盘子直接移动到目标座位的输出
move(x-1,b,a,c); //最后将前x-1个盘子移动到目标座位
}
}