捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >知识点备忘 > 正文
15 2018.02

S1E35:汉诺塔

点击次数:1014 更新时间:2018/2/15 17:39:52  【打印此页

知识点回顾

原始状态下的汉诺塔如下:

 

Step1 X->Z:

 

Step2 X->Y:

 

Step3 Z->Y:

 

Step4 X->Z:

 

Step5 Y->X:

 

Step6 Y->Z:

 

Step7 X->Z:

 

对于上述游戏的玩法,可以简单分解为三个步骤:

 

1.    将前 63 个盘子从 X 移动到 Y上,确保大盘在小盘下。

2.    将最底下的第 64 个盘子从 X 移动到 Z 上。

3.    将 Y 上的 63 个盘子移动到 Z 上。


在游戏中,由于每次只能移动一个圆盘,所以在移动的过程中显然要借助另外一根针才可以实施。也就是说,步骤 1 将 1~63 个盘子移到 Y 上,需要借助 Z;步骤 3 将 Y 针上的 63 个盘子移到 Z 针上,需要借助 X。

所以我们把新的思路聚集为以下两个问题:

 

·         问题一:如何将 X 上的 63 个盘子借助 Z 移到 Y 上?

·         问题二:如何将 Y 上的 63 个盘子借助 X 移到 Z 上?


解决这两个问题的方法跟解决“如何将 X 上的 64 个盘子借助 Y 移动到 Z 上?”这个问题是一样的,都是可以拆解成 1、2、3 三个步骤来实现。

问题一(“如何将 X 上的 63 个盘子借助 Z 移到 Y 上?”)拆解为:

 

1.    将前 62 个盘子从 X 移动到Z上,确保大盘在小盘下。

2.    将最底下的第 63 个盘子移动到 Y 上。

3.    将 Z 上的 62 个盘子移动到 Y 上。


问题二(“如何将 Y 上的 63 个盘子借助 X 移到 Z 上?”)拆解为:
 

1.    将前 62 个盘子从 Y 移动到 X 上,确保大盘在小盘下。

2.    将最底下的第 63 个盘子移动到 Z 上。

3.    将 X 上的 62 个盘子移动到 Y 上。


没错,汉诺塔的拆解过程刚好满足递归算法的定义,因此,对于如此难题,使用递归来解决,问题就变得相当简单了!

#include <stdio.h>

void hanoi(int n, char x, char y, char z);

void hanoi(int n, char x, char y, char z)
{
        if (n == 1)
        {
                printf("%c --> %c\n", x, z); // 剩下底部的那个圆盘
        }
        else
        {
                hanoi(n-1, x, z, y); // 将n-1个圆盘从x移动到y
                printf("%c --> %c\n", x, z);
                hanoi(n-1, y, x, z); // 将n-1个圆盘从y移动到z
        }
}

int main(void)
{
        int n;

        printf("请输入汉诺塔的层数:");
        scanf("%d", &n);

        hanoi(n, 'X', 'Y', 'Z');

        return 0;
}
提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1014 更新时间:2018/2/15 17:39:52  【打印此页

上一条:S1E34:递归

下一条:S1E36:快速排序

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修