例题一 汉诺塔问题
描述
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
如何移?最少要移动多少次?
输入
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
输出
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如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
代码实现
#include<iostream>
using namespace std;
int main()
{
int n;
char from, to, resort;
cin >> n >> from >> resort >> to;
void hanoi(int n, char from, char resort, char to);
hanoi(n, from, resort, to);
}
void hanoi(int n, char from, char resort, char to)
{
if (n == 1)
{
cout << n <<":"<< from << "->" << to << endl;
return;
}
else
{
hanoi(n - 1, from, to, resort);
cout << n << ":" << from << "->" << to << endl;
hanoi(n - 1, resort, from, to);
return;
}
}