汉诺塔问题

问题:

Hanoi(汉诺)塔问题。这时一个古典的数学问题,是一个递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C(如下图)。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。

解题思路:

要把64个盘子从A座移动到C座,一般人是不可能确定怎么移动盘子的每一个具体步骤的。所以我们需要找到一个解决问题的办法,把看似简单的问题简单化,使问题得以迎刃而解。

我们可以将63个盘子移动到B座,然后将A座的盘子移动到C座,这时就把移动64个盘子的问题简化为移动63个盘子,难度减小了一些。但是我们怎么才能将63个盘子从A座移到B座?

要想将63个盘子移动到B座,我们只需将62个盘子移动到C座,再将A座的一个盘子移动到B座。这时的问题又转换为如何将62个盘子移动到C座。

要想将62个盘子移动到C座,我们只需将61个盘子移动到B座,再将A座的一个盘子移动到C座。这时的问题又转换为如何将61个盘子移动到B座。

......

这样层层递归下去,问题就简单很多了,只要有足够的时间就可以以最少的步骤将A座的盘子移动到C座了。

思路实践:

为了更好理解递归在此问题的运用,我们可以将A,B,C的三个座分为起始塔,中转塔,目标塔。下面我们将试着移动四个盘子。

1. A座前三个盘子移动到B座

要想将这三个盘子移动到B座,我们应该先将前两个盘子移动到C座,而要想把前两个盘子移动到C座,我们应该先将前一个盘子移动到B座。这时我们逆着推回去就可以得到这里移动的整个步骤:

A -> B(第一个盘子移动到了B座)

A -> C(第二个盘子移动到了C座)

B -> C(B座的盘子移动了到C座)

其中将前两盘子从A座移动到C座是以A座为起始塔,B为中转塔,C为目标塔进行的移动。

 A -> B(第三个盘子移动到了B座)

最后需要将C座的两个盘子移动到B座,这时就以C座为起始塔,A为中转塔,B为目标塔进行移动,跟上面移动两个盘子相比不同的就是将A换为C,B换为A,C换为B,那么这里的移动步骤就是:

C -> A, C -> B, A -> B。

综上,这一步的移动步骤为:A -> B, A -> C, B -> C, A -> B, C -> A, C -> B, A -> B

2. A座最后一个盘子移动到C座 (A -> C) 

3. B座的三个盘子移动到C座

由1可知A座前三个盘子移动到座的移动步骤为:

A -> B, A -> C, B -> C, A -> B, C -> A, C -> B, A -> B

我们可以知道第一步1是以A座位起始塔,C位中转塔,B位目标塔进行三个盘子的移动,而第3步是以B座为起始塔,A座为中转塔,C座为目标塔进行三个盘子的移动,以此可以知道第三步的步骤为:B->C  B->A  C->A  B->C  A->B  A->C  B->C 

综上,移动四个盘子的完整步骤就为:

A->B  A->C  B->C  A->B  C->A  C->B  A->B  A->C  B->C  B->A  C->A  B->C  A->B  A->C  B->C 

假设A座有n个盘子,从上面的移动步骤我们可以知道盘子的移动可以分为三步:

1. 把起始塔的前n-1个盘子放到中转塔上。

(1). 把起始塔的前n-2个盘子放到中转塔上。

......

(2). 然后把起始塔的一个盘子放到目标塔上。

(3). 最后中转塔的n-2个盘子放到目标塔上。

......

2. 然后把起始塔的一个盘子放到目标塔上。

3. 最后把中转塔的n-1个盘子放到目标塔上。

(1). 把起始塔(前一步的中转塔)的前n-2个盘子放到中转塔上。

......

(2). 然后把起始塔的一个盘子放到目标塔上。

(3). 最后中转塔的n-2个盘子放到目标塔上。

......

就这样层层递归下去我们就可以得到一个完整的步骤了。

代码分析:

写一个move函数表示盘子从x座移到y座的过程。写一个递归函数,根据上面的分析可知第一步是用递归将n-1个盘子移动到中转塔上,第二步是将起始塔的一个盘子移动到目标塔上,第三步是用递归将中转塔上的盘子移动到目标塔上,当n==1(也就是A座还有一个盘子时)结束递归,其中我们只需要将确定递归的最后一步的步骤就可以写出这个递归函数了,比如第一个递归是将n-1个盘子移动到中转塔上,那它递归到最后面就是将A座的第一个盘子移动到B座上,所以递归就写成Hanoi(n - 1, a, c, b);

完整代码:

void move(char x,char y)
{printf(" %c->%c ", x, y);
}
void Hanoi(int n, char a, char b, char c)
{if (n == 1){move(a, c);}else{Hanoi(n - 1, a, c, b);move(a, c);Hanoi(n - 1, b, a, c);}
}
int main()
{int n = 0;printf("请输入盘子的数量>:");scanf("%d", &n);Hanoi(n, 'A', 'B', 'C');return 0;
}

 A座上一开始放四个盘子时,移动盘子的步骤:

网页版汉诺塔小游戏:

汉诺塔小游戏 (fuyeor.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++模板进阶操作 ---非类型模板参数、模板的特化以及模板的分离编译

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

MyBatis标签及其应用示例

MyBatis标签及其应用示例 1. select 1.1 标签属性 id唯一的标识符parameterType传给此语句的参数的全路径名或别名如:com.xxx.xxx.demo.entity.User或userresultType语句返回值类型或别名。如果是集合List,此处填写集合的泛型T,而不是集合…

启动springboot时报错 APPLICATION FAILED TO START 包冲突

启动springboot时报错 APPLICATION FAILED TO START 包冲突 problem 具体日志如下 *************************** APPLICATION FAILED TO START ***************************Description:An attempt was made to call a method that does not exist. The attempt was made fr…

[python]matplotlib

整体图示 .ipynb 转换md时候图片不能通知携带&#xff0c;所有图片失效&#xff0c;不过直接运行代码可以执行 figure figure,axes与axis import matplotlib.pyplot as plt figplt.figure() fig2plt.subplots() fig3,axsplt.subplots(2,2) plt.show()<Figure size 640x480 …

云原生学习系列之基础环境准备(虚拟机搭建)

最近由于工作需要开始学习云原生相关内容&#xff0c;为方便学习操作&#xff0c;准备在外网搭建自己的环境&#xff0c;然后进行相关的练习&#xff0c;搭建环境的第一步便是虚拟机的安装。 基础软件 这里我用到的是CentOS-7-x86_64的操作系统。 链接&#xff1a;https://pa…

Eureka注册及使用

一、Eureka的作用 Eureka是一个服务注册与发现的工具&#xff0c;主要用于微服务架构中的服务发现和负载均衡。其主要作用包括&#xff1a; 服务提供者将自己注册到Eureka Server上&#xff0c;包括服务的地址和端口等信息。服务消费者从Eureka Server上获取服务提供者的地址…

Go(Golang)的10个常见代码片段用于各种任务

探索有用的Go编程代码片段 提供“前10名”Go&#xff08;Golang&#xff09;代码片段的明确列表是具有挑战性的&#xff0c;因为代码片段的实用性取决于您试图解决的具体问题。然而&#xff0c;我可以为您提供十个常用的Go代码片段&#xff0c;涵盖了各种任务和概念&#xff1…

【驱动序列】简单聊聊开发驱动程序的缘由和驱动程序基本信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》&#xff0c;这是《驱动程序》专栏序列文章。 这是2024年第4篇文章&#xff0c;此篇文章是结合了C#知识点实践序列文章&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xf…

树莓派4B-Python使用PyCharm的SSH协议在电脑上远程编辑程序

目录 前言一、pycharm的选择二、添加SSH的解释器使用总结 前言 树莓派的性能始终有限&#xff0c;不好安装与使用高级一点的程序编辑器&#xff0c;如果只用thonny的话&#xff0c;本人用得不习惯&#xff0c;还不如PyCharm&#xff0c;所以想着能不能用电脑中的pycharm来编写…

IO作业2.0

思维导图 1> 使用fread、fwrite完成两个文件的拷贝 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {if(argc ! 3) //判断外部参数 {printf("The terminal format is incorrect\n");r…

OpenGL FXAA抗锯齿算法(Qt,Consloe版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经提供了使用VCG读取Mesh的方式,接下来就需要针对读取的网格数据进行一些渲染操作了。在绘制Mesh数据时总会遇到图形的抗锯齿问题,OpenGL本身已经为我们提供了一种MSAA技术,但该技术对于一些实时渲染性能有…

计算机组成原理——冯诺依曼计算机硬件框图

存储器&#xff1a;存放数据和程序 运算器&#xff1a;算术运算和逻辑运算 控制器&#xff1a;指挥程序的运算 输入设备&#xff1a;将信息转化成机器能识别的形式 输出设备&#xff1a;将结果转化成人们熟悉的形式

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

使用Apache Commons SCXML实现状态机管理

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们程序员在开发过程中&#xff0c;经常会遇到需要管理不同状态和状态之间转换的场景。比如&#xff0c;一个在线购物的订单&#xff0c;它可能有“新建订单”、“已支付”、“配送中”、“已完成”等状态。在这…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

uniapp运行到开发者工具中

uniapp 项目在微信开发者工具中运行&#xff0c;用于开发微信小程序。 微信 appid 获取地址&#xff1a;微信公众平台 运行到微信开发者工具中 一、进入微信公众平台、微信扫码登录、选择开发管理、选择开发设置、复制 appid 。 二、打开 manifest.json 配置文件、选择微信小…

居家康养领导品牌“颐家”完成B轮融资,商业化进程再加速

近日&#xff0c;颐家&#xff08;上海&#xff09;医疗养老服务有限公司&#xff08;以下称“颐家”“公司”&#xff09;宣布引入战略股东。此次融资额达数千万元人民币&#xff0c;资金将主要用于公司业务数智化升级及自费业务产品开发、团队扩展和业务渠道的开拓。本轮融资…

闭包,垃圾回收机制

1.垃圾回收机制 当函数执行完毕后,函数内部的变量就会被销毁。 代码&#xff1a; function fn() {var a 10;a;return a;}console.log(fn()); 输出的结果: 11 持续调用的结果: 2.变量的私有化 代码: function fn() {var a 10;return function fn1() {return a;}…

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件&#xff0c;有如下一段话&#xff1a; 在构建 Redis 时&#xff0c;通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc&#xff0c;但在 Linux 系统上&#xff0c;jemalloc 是…

c语言内嵌汇编知识点记录

内容在飞书云文档&#xff0c;点击打开即可。 Docshttps://r0dhfl3ujy9.feishu.cn/docx/EaVIdjGVeoS6fUxiKWkcjAq8nWg?fromfrom_copylink