【题目链接】
[ybt 1205:汉诺塔问题
OpenJudge NOI 2.2 6261:汉诺塔问题
【题目考点】
1. 递归
【解题思路】
设输入的左中右三个杆分别为a,b,c。题目要将摞在a杆上的n层汉诺塔移动到b杆上,在这一过程会借助c杆。
- 递归问题:将x杆上的k层汉诺塔移动到y杆上,在这一过程中会借助z杆。
- 递归关系:要想将x杆上的k层汉诺塔移动到y杆,可以先将x杆上的k-1层汉诺塔移动到z杆,借助y杆。
再将x杆上的圆盘移动到y杆,由于这一层圆盘是k层汉诺塔的底层,那么这个圆盘的编号为k,输出“把k号圆盘从x移动到y”。
最后将z杆上的k-1层汉诺塔移动到y杆,借助x杆。 - 递归出口:如果要移动的是0层汉诺塔,那么就不移动了。
【注意】由于输出数据较多,如果用cout输出可能会超时,最好使用scanf与printf。
【题解代码】
解法1:递归
#include <bits/stdc++.h>
using namespace std;
void hanoi(int k, char x, char y, char z)//输出k层汉诺塔从x杆移动到y杆借助z杆的解法
{
if(k == 0)
return;
hanoi(k-1, x, z, y);//将k-1层汉诺塔从x杆移动到z杆借助y杆
printf("%c->%d->%c\n", x, k, y);//输出将k号圆盘从x移动到y
hanoi(k-1, z, y, x);//将k-1层汉诺塔从z杆移动到y杆借助x杆
}
int main()
{
int n;
char a, b, c;
scanf("%d %c %c %c", &n, &a, &b, &c);
hanoi(n, a, b, c);
return 0;
}