汉诺塔算法

来源:互联网 发布:房地产网络推广职责 编辑:程序博客网 时间:2024/04/25 23:33
 

/*汉诺塔算法

解法如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。

如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,

也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。

事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1

 */

#include <stdio.h>

//可以把A,B,C依次当成源,辅助,目的

void hanoi(int n, char A, char B, char C)

{

    if(n == 1)       //只有一个盘子时,就将它从“源”直接搬至“目的”

       {

        printf("Move sheet %d from %c to %c\n", n, A, C);  

    }

       //如果盘数超过2个(n>2),处理上边的n-1个盘子,以A为源,C为辅助,B为目的

       //上边的n-1个处理完,B上有n-1个盘子,A上有一个,

       //处理最下边的第n个,将A上的最后一个移动到C上,再以B为源,C为目的,A为辅助移动

       //B上的n-1个盘子

    else

       {

        hanoi(n-1, A, C, B);

        printf("Move sheet %d from %c to %c\n", n, A, C);

        hanoi(n-1, B, A, C);

    }

}

 

int main(void)

{

    int n;

    printf("请输入盘数:");

    scanf("%d", &n);

    hanoi(n, 'A', 'B', 'C');

    return 0;

}

原创粉丝点击