Hanoi Tower(汉诺塔)问题
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
Input
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
Output
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1, 2, …n。
即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
Sample Input
3 a b c
Sample Output
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
思路:(伪代码)
//首先找递归出口,当只有一个盘子的时候就是递归出口
void hanoi(int n,char A,char B,char C){
if(n==1){
move(A,C);}
//然后把n上面的(n-1)块绕过B,放到C
else{
haoni(n-1,A,C,B);
move(A,C);
//在把B上面的(n-1)块,绕过A,放到C上面
hanoi(n-1,B,A,C);
}
}
这就是汉诺塔的递归过程
代码实现:
#include<stdio.h>
void hanoi(int n,char A,char B,char C) //首先定义一个递归函数
{
if(n==1){
printf("%d:%c->%c\n",n,A,C); //题目中要求输出圆盘编号,按题目要求输出
}
else{
hanoi(n-1,A,C,B);
printf("%d:%c->%c\n",n,A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
char a,b,c;
scanf("%d",&n);
getchar();
//因为输入字符,如果不打getchar会把上一次输入n后的回车当一个字符输入
//但是也可以scanf("%d %c %c %c",&n,&a,&b,&c);输入。
scanf("%c %c %c",&a,&b,&c);
hanoi(n,a,b,c); //调用递归函数
return 0;
}
这是一道经典的递归问题