有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
输入
>
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
输出
>
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。
用一个移动(只移动一个盘子,用move打印编号),另一个函数递归(移动很多盘子,给出第一个盘子编号)
#include<iostream>
using namespace std;
void move(int disks, char src, char desc) {
cout << disks << ":" << src << "->" << desc << endl;
return;
}
void hannoi(char src, char desc, char by, int amount)
{
if (amount == 1) {
move(1, src, desc);
return;
}
hannoi(src, by, desc, amount - 1);
move(amount, src, desc);
hannoi(by, desc, src, amount - 1);
}
int main()
{
int n;
char a, b, c;
scanf("%d %c %c %c", &n,&a,&b,&c);
hannoi(a, c,b, n);
return 0;
}