Hanoi Tower(汉诺塔)问题/C语言表达

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;
}

这是一道经典的递归问题

发布了33 篇原创文章 · 获赞 35 · 访问量 1296

猜你喜欢

转载自blog.csdn.net/qq_45856289/article/details/103096024