汉诺塔算法

 

/*汉诺塔算法

解法如果柱子标为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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值