~汉诺塔~(C语言)~

 引言   

        汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从上面开始按大小顺序重新摆放在另一根柱子上。 


1. 玩游戏 

        为了大家能更好的理解代码,建议去玩一下游戏,(电脑端)点这即可

        那么,话不多说,我们一起来看看吧! 


2. 题目描述

        有三根柱子,其中柱子上有一堆盘子,盘子按从小到大的顺序叠放。现在的目标是将所有的盘子按大小顺序重新叠放在另一根柱子上。并且规定,任何时候,小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。我们该如何去实现呢?请列出移动步骤?


3. 题目分析

        解题思路:我们需要把圆盘看成一个一个的整体,将大事化小,繁事化简。并假设三个柱子分别为A、B、C(A:起始柱,B:中转柱,C:目标柱)。实际上,解决汉诺塔问题是有规律可循的:

  1. 当起始柱上只有 n=1 个圆盘时,我们可以很轻易地将它移动到目标柱
  2. 当起始柱上有 n=2 个圆盘时,移动过程是:先将起始柱上的第 1 个圆盘移动到辅助柱上,然后将起始柱上剩下的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。
  3. 当起始柱上有 n=3 个圆盘时,会发现,移动过程和 n=2 个圆盘的情况类似:先将起始柱上的 2 个圆盘移动到辅助柱上,然后将起始柱上遗留的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。

 

图 1 移动两个圆盘

图 2 移动三个圆盘

        通过分析以上 3 种情况的移动思路,可以总结出一个规律:对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:

  1. 将起始柱上的 n-1 个圆盘移动到辅助柱上;
  2. 将起始柱上剩下的 1 个圆盘移动到目标柱上;
  3. 将辅助柱上的所有圆盘移动到目标柱上。

        由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。

        需要注意的是,在我们解决汉诺塔问题时,不能太过于深究圆盘移动的过程,一旦盘子数量较多,移动过程是极其复杂繁多的,容易把自己绕晕,我也不建议大家去理清移动过程。我们只需要理解汉诺塔的实现原理,运用大事化小,繁事化简的思想,就相对容易多了。

4. 代码实现 

        这里的递归限制条件为 n=1

#include<stdio.h>// 移动盘子函数
void Move(char star, char goal)
{printf("%c --> %c\n", star, goal);
}// 汉诺塔Hanno函数
void Hanno(int n, char star, char temp, char goal)
{// 如果只有一个盘子,直接移动if (n == 1){Move(star, goal);}else{// 将 n-1 个盘子从起始柱移动到中转柱Hanno(n - 1, star, goal, temp);// 将剩余的一个盘子从起始柱移动到目标柱Move(star, goal);// 将之前移动到中转柱的 n-1 个盘子再从中转柱移动到目标柱Hanno(n - 1, temp, star, goal);}
}int main()
{// 定义起始柱、中转柱、目标柱以及盘子数量char star = 'A';char temp = 'B';char goal = 'C';int numDish = 3; // 盘子数量// 调用移动盘子函数Hanno(numDish, star, temp, goal);return 0;
}
// 移动 2^numDish-1 次

5. 结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

        完结!咻~

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

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

相关文章

npm run serve启动报错npm ERR! Missing script: “serve“

启动项目的时候用npm run serve发现报了以下的错误 解决方法&#xff1a; 1.一般情况下&#xff0c;这个问题是因为package.json文件里面确实没有 这里没有可能因为你的脚手架版本比较低&#xff0c;如果不想换&#xff0c;可以用 这里面有的 npm run dev去启动也是可以的 n…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 &#xff0c;赋能科技互联”&#xff0c;精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验&#xff0c;精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

Vue3之ElementPlus中Table选中数据的获取与清空方法

Vue3之ElementPlus中Table选中数据的获取与清空方法 文章目录 Vue3之ElementPlus中Table选中数据的获取与清空方法1. 点击按钮获取与清空选中表格的数据1. 用到ElementPlus中Table的两个方法2. 业务场景3. 操作案例 1. 点击按钮获取与清空选中表格的数据 1. 用到ElementPlus中…

分享一个学英语的网站

名字叫&#xff1a;公益大米网​​​​​​​ Freerice 这个网站是以做题的形式来记忆单词&#xff0c;题干是一个单词&#xff0c;给出4个选项&#xff0c;需要选出其中最接近题干单词的选项。 答对可以获得10粒大米&#xff0c;网站的创办者负责捐赠。如图 触发某些条件&a…

Web APIs - 06

正则表达式 正则表达式是一种字符串匹配的规则 使用场景&#xff1a; 例如验证表单&#xff1a;手机号表单要求用户只能输入11位的数字 (匹配)过滤掉页面内容中的一些敏感词(替换)&#xff0c;或从字符串中获取我们想要的特定部分(提取)等 正则基本使用 定义规则 const reg…

手把手教你绘制自定义控件

主要是注意两点,一点是在控件构造函数中设置一些属性,另一点是重写OnPaint方法,参考代码那如下: class SelfControl:Control{public SelfControl(){//this.SetStyle(ControlStyles.ResizeRedraw, true);//空间大小改变时,控件会重绘//this.SetStyle(ControlStyles.UserPai…

代码随想录算法训练营第三十四天 860.柠檬水找零 、 406.根据身高重建队列、452. 用最少数量的箭引爆气球

代码随想录算法训练营第三十四天 | 860.柠檬水找零 、 406.根据身高重建队列、452. 用最少数量的箭引爆气球 860.柠檬水找零 题目链接&#xff1a;860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean lemonadeChange(int[] bills) {//…

TOP100 图论

3.207. 课程表 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课…

el-form validator的校验提示遮盖下边的内容

问题&#xff1a;表单的validator校验&#xff0c;无法自动撑起tip提示的高度&#xff0c;导致遮盖了下边内容 解决方式&#xff1a;将tip提示的样式的定位设置为遵循正常的文档流对象&#xff0c;实现自适应高度。 .el-form-item .el-form-item__content .el-form-item__err…

探索ls命令中的通配符匹配

在Linux系统中&#xff0c;ls命令是一个常用的文件列表显示工具。除了基本的文件显示功能外&#xff0c;ls还支持通配符匹配&#xff0c;通过使用通配符&#xff0c;用户可以更灵活地过滤和显示文件。本篇博客将介绍ls命令中的通配符&#xff0c;包括问号&#xff08;?&#x…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

Cesium 问题——加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

Redis:常用数据类型及其应用场景

Redis中常见的数据类型有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&#xff09;。下面我来分…

Java 基于 SpringBoot+Vue 的高校招生系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

[计算机网络]---Http协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xf…

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…

【DRAM存储器二十】DDR3介绍-主要功能之ODT

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光DDR3数据手册》 、《JESD79-3E》 目录 DDR3 ODT

【多线程】线程的概念与创建

多线程 1. 认识线程&#xff08;Thread&#xff09;线程是什么为啥要有线程进程和线程的区别Java 的线程 和 操作系统线程 的关系 2.第⼀个多线程程序3.创建线程⽅法1 继承 Thread 类⽅法2 实现 Runnable 接⼝方法3 匿名内部类创建 Thread ⼦类对象方法4 匿名内部类创建 Runnab…

01_basicLinux内核模块

环境 rootT:/media/sf_D_DRIVE/kmodule/01_basic# cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.1 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HO…

JavaScript:面向对象编程

文章目录 对象&#xff08;Objects&#xff09;构造函数&#xff08;Constructor functions&#xff09;原型&#xff08;Prototypes&#xff09;原型链&#xff08;Prototype chain&#xff09;类&#xff08;Classes&#xff09;继承&#xff08;Inheritance&#xff09; Jav…