汉诺塔问题求解

古代某寺庙中有一个梵塔,塔内有3个座A、B和C,座A上放着64个大小不等的盘,其中大盘在下,小盘在上。有一个和尚想把这64 个盘从座A搬到座B,但一次只能搬一个盘,搬动的盘只允许放在其他两个座上,且大盘不能压在小盘上。现要求用程序模拟该过程,输入一个正整数n,代表盘子的个数,编写函数

void hanoi(int n,char a,char b,char c)

其中,n为盘子个数,从a座到b座,c座作为中间过渡,该函数的功能是输出搬盘子的路径。

输入格式:

输入在一行中给出1个正整数n。

输出格式:

输出搬动盘子路径。

输入样例:

3

结尾无空行

输出样例:

a-->b
a-->c
b-->c
a-->b
c-->a
c-->b
a-->b
#include 
int main()
{
    int n ;
    scanf("%d",&n) ;
    hanoi(n,'a','b','c') ;//注意:传入的是a,b,c字母
    return 0 ;
}
void hanoi(int n,char a,char b,char c)
{
    if(n == 1)
    {
        printf("%c-->%c\n",a,b) ;//当只剩下一个时,那我们就可以直接将它从a放到b
    }
    else
    {
        hanoi(n-1,a,c,b);//n-1说明我们已经将一个从a放到了c,这个时候,c不能再放,将b,c互换位置
        printf("%c-->%c\n",a,b) ;//再将下一个放到b,
        hanoi(n-1,c,b,a) ;//最后,当将a中最后一个放到b上时,相当于此时是要将盘子从c移到b,
    }
}

对于这道题,我们可以先模拟,找到规律,再使用递归的方式解决。

首先,当n==1时我们直接将它从a移到b即可。那接下来我们再来模拟其他情况,当n更大时,我们需要先将第一个移到c,因为小的上面不能放大的,所以下一个必然要放到b,所以这个时候我们将b,c互换,那么下一个盘子放到b。然后当a中最后一个也就是最大的一个盘子放到b之后,就相当于现在要把n-1个盘子从,c放到a,所以互换a,c即可。那么n个盘子就这样一步步递归最后当n==1时结束即可。

你可能感兴趣的:(c语言,递归法)