n阶Hanoi塔问题(动图分析)-C语言

Hanoi塔问题规则

  1. 每次只能移动一个圆盘;
  2. 圆盘可以插在X、Y和Z中的任一塔座上;
  3. 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

如下所示是一个3阶的Hanoi塔演示(从左至右依次为X、Y、和Z塔):
三阶Hanoi塔演示

xyz

动态演示通过ppt录屏演示,有一定缺陷,望见谅

Hanoi塔分析

  1. 是n=1阶汉诺塔时,将唯一的圆盘从塔座X直接移至塔座Z。
    1阶Hanoi塔

  2. 当n>1时(动图展示为n=3),需要利用Z作为辅助塔,总是设法将X塔的最后一个圆盘n移动到Z塔下,则必然要将1到n-1个圆盘移动到Y塔上

Y塔作为辅助塔

  1. 此时Y塔作为最初的X塔的状态,X塔作为Z塔的最初状态,X塔是辅助塔,应该将当前Y塔下的最后一个圆盘n-1移动到Z塔上
    X塔作为辅助塔
  2. 若n>3,则不断在2.和3.循环执行,直到将所有的圆盘全部移动到Z塔上
  3. 当还剩最后一个圆盘时,则执行第一个步骤,直接将圆盘移动到Z塔.
    最后一个圆盘

如上步骤一般,当n>1总是在步骤2 3重复,且Z塔与X塔交换着成为辅助塔。所以我们可以用递归来处理这种重复的步骤。

void hanoi(int n, char x, char y, char z) {
    if(n == 1) {                          // 最后一个圆盘
        move(x, 1, z);                    // 将最后一个圆盘从x移到z
    } else {
        hanoi(n - 1, x, z, y);            // 将x上编号为1至n-1的圆盘移到y,z是辅助塔
        move(x, n, z);                    // 将编号为n的圆盘从x移到z
        hanoi(n - 1, y, x, z);            // 将y上编号为1至n-1的圆盘移动到z,x是辅助塔
    }
}

参考程序

参考程序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值