C语言--汉诺塔【内容超级详细】

 今天与大家分享一下如何用C语言解决汉诺塔问题。


目录

一.前言

 二.找规律⭐

三.总结⭐⭐⭐

四.代码实现⭐⭐


一.前言

有一部很好看的电影《猩球崛起》⭐,说呀,人类为了抗击癌症发明了一种药物🍗,然后给猩猩做了实验,结果猩猩打完药后,变得异常聪明,人们给猩猩测试智力,用的就是汉诺塔,图中猩猩玩的东西就是这个智力玩具啦!⭐


 背景汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

这个游戏的规则是这样的:有A,B,C三个柱子,A柱子上面放着n个盘子,要求把A上面的盘子全都移动到C上,规则是:

  1. 每次只能移动1个盘子
  2. 任何时侯不能把一个大的盘子压到小的盘子上面 

     假设每次移动需要1s的时间,(非常快了,那可是黄金圆盘)那么婆罗门需要多长时间才能把64片黄金圆盘从一根石柱上移动到另一个石柱上呢?

先说结果:64片的圆盘需要移动2^62-1次,算一算,需要移动 18446744073709551615 次,每次一秒,移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.42亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。emm,大梵天绝对是在坑爹呀🍗


 二.找规律⭐

当n==1时,只有一个盘子时,直接把盘子从A移到C即可

最少需要:1次


当n==2时,有两个盘子 ,移动如下。

A->B 

A->C

B->C

最少需要:3次

 当n==3时,移动如下,把三个盘子从A通过B移动到C

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

最少需要:7次



当n==4时,问题就稍微有一点点复杂。

1.向n==3那样,我们可以先移动上面3个盘子,从A通过C移到B,只不过n==3时是把三个盘子从A通过B移动到C,不同的是把C和B的地位换了一下。原理是一样的。

2.把A的最后一个盘子移到C

3.再把B上面的三个盘子通过A移到C(还是像n==3的一样)

最少需要:15次


当n==5时呢!

1.和n==4的一样,把上面的4个盘子,从A通过C移到B

2.把A的最后一个盘子从A移到C

3.把B上面的4个盘子从B通过A移到C

最少需要:31次


三.总结⭐⭐

依次类推,我们会发现每次都有三个动作。

1.把n-1个盘子从A通过C移动到B

2.把第n个盘子,从A移动到C

3.再把n-1个盘子从B通过A移动到C

4.不难发现当有n个盘子,移动完成后,最少需要:2^n-1次


四.代码实现⭐

1.从键盘获取盘子的数量🍗

	int n; //汉诺塔的盘子个数printf("请输入盘子的个数: ");scanf("%d", &n);

2. 定义汉诺塔函数🍗

void Han(int n, char a, char b, char c)
{if (n == 1)move(a, c); //如果仅有一个盘子,那么直接从A移到Celse{//每次都有三个动作Han(n - 1, a, c, b); //把n-1个盘子,从a通过c移到bmove(a, c);          //把第n个盘子从a移到cHan(n - 1, b, a, c); //最后把n-1个盘子从b通过a移到c}
}

3.定义移动函数,用于表示怎么移动🍗

void move(char x, char y)
{printf("把%c->%c\n", x, y);//意思是把x上最上面的盘子移动到y上面count++; //每一动一次计数器加加,最后看一下总共要移动多少次
}

4.定义一个全局变量,用于统计移动的次数🍗

int count;//定义一个全局变量,用于统计移动的次数

5.完整代码🍗

//汉诺塔
int count = 0;//定义一个全局变量count
void move(char x, char y)
{printf("把%c->%c\n", x, y);//意思是把x上最上面的盘子移动到y上面count++; //每一动一次计数器加加,最后看一下总共要移动多少次
}
void Han(int n, char a, char b, char c)
{if (n == 1)move(a, c); //如果仅有一个盘子,那么直接从A移到Celse{Han(n - 1, a, c, b);move(a, c);Han(n - 1, b, a, c);}
}
int main()
{int n; //汉诺塔的盘子个数printf("请输入盘子的个数: ");scanf("%d", &n);Han(n, 'A', 'B', 'C');printf("一共移动的次数=%d", count);return 0;
}

运行结果:


创作不易, 如果这份博客👍对你有帮助,可以给博主一个免费的点赞以示鼓励。
欢迎各位帅哥美女点赞👍评论⭐收藏⭐,谢谢!!!
如果有什么疑问或不同的见解,欢迎在评论区留言哦👀。
祝各位生活愉快⭐

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

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

相关文章

【Java】I/O流—缓冲流的基础入门和文件拷贝的实战应用

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:你能坚持到什么程度,决定你能达到什么高度 📢欢迎大家关注🔍点赞👍收藏⭐️留言📝 文章目录 一.&…

基于springboot实现福聚苑社区团购平台系统项目【项目源码】

基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&…

git增加右键菜单

有次不小心清理系统垃圾,把git右击菜单搞没了,下面是恢复方法 将下面代码存为.reg文件,双击后导出生效,注意,你安装的git必须是默认C盘的,如果换了地方要改下面注册表文件中相关的位置 Windows Registry …

Windows搭建minio存储

minio功能类似以ftp 小白教程,一看就会,一做就成。 1.下载软件 https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2.部署配置 我是在D盘下创建了minio目录 minio.exe是软件minio.log是日志(不用创建)minio900…

骑士巡游问题

一、骑士巡游问题 题目描述:骑士在8*8的国际象棋棋盘上进行巡游,当指定骑士出发的位置后(x,y),能输出骑士遍历棋盘的所有路径坐标。 输出效果: 代码(请在visual stdio下运行,Dev-C…

虚幻引擎:如何进行关卡切换?

一丶非无缝切换 在切换的时候会先断开连接,等创建好后才会链接,造成体验差 蓝图中用到的节点是 Execute Console Command 二丶无缝切换 链接的时候不会断开连接,中间不会出现卡顿,携带数据转换地图 1.需要在gamemode里面开启无缝漫游,开启之后使用上面的切换方式就可以做到无缝…

Scala中编写多线程爬虫程序并做可视化处理

在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理,需要使用Selenium和Jsoup库来操作网页。在这个例子中,我们将使用多线程来提高爬取速度。 1、首先,我们需要引入所需的库: import org.openqa.selenium.By import org.o…

Milvus Cloud——Agent 框架工作方式

Agent 框架工作方式 我们以 AutoGPT 为例,看看一个 Agent 框架具体是如何工作的: AutoGPT[2] 使用 GPT-4 来生成任务、确定优先级并执行任务,同时使用插件进行互联网浏览和其他访问。AutoGPT 使用外部记忆来跟踪它正在做什么并提供上下文&am…

软文推广中如何搭建媒体矩阵

媒体矩阵简单理解就是在不同的媒体平台上,根据运营目标和需求,建立起全面系统的媒体布局,进行多平台同步运营。接下来媒介盒子就来和大家聊聊,企业在软文推广过程中为什么需要搭建媒体矩阵,又该如何搭建媒体矩阵。 一、…

Python基础教程之十九:Python优先级队列示例

1.什么是优先队列 优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素还具有与之关联的“优先级”。在优先级队列中,优先级高的元素先于优先级低的元素提供。如果两个元素具有相同的优先级,则将根据其在队列…

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…

Python机器学习算法入门教程(第四部分)

接着Python机器学习算法入门教程(第三部分),继续展开描述。 十九、信息熵是什么 通过前两节的学习,我们对于决策树算法有了大体的认识,本节我们将从数学角度解析如何选择合适的“特征做为判别条件”,这里…

内存条选购注意事项(电脑,笔记本)

电脑内存条的作用、选购技巧以及注意事项详解 - 郝光明的个人空间 - OSCHINA - 中文开源技术交流社区 现在的电脑直接和内存条联系 电脑上的所有输入和输出都只能依靠内存条 现在买双条而不是单条 买两个相同的内存条最好 笔记本先分清是低电压还是标准电压,DD…

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件,有时候我们需要对一些重要的Excel文件进行加密,以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一:通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码(密码只可以使数字、字…

【Vue】组件封装小技巧 — 利用$attrs和v-bind接收传递未定义的属性

使用介绍 在Vue.js中,$attrs 和v-bind可以用于组件的二次封装,以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码: 假设你有一个名为MyButton的自定义按钮组件,它接受一些…

pdf.js不分页渲染(渲染完整内容)

直接上代码 首先引入pdf.js 和 pdf.worker.js // 渲染pdf const pdfUrl test1.pdf, _targetDom pdf-container;pdfjsLib.getDocument(pdfUrl).promise.then(async doc > {let _i 0;for (let item of new Array(doc.numPages).fill()) {await renderOtherPage(doc, _i, _t…

K8S概念与架构

K8S概念与架构 一、Kubernetes 概述1、K8S 是什么2、为什么要用 K8S3、k8s介绍二、Kubernetes 集群架构与组件2.1、Master核心组件 2.2、Node核心组件 三、Kubernetes 核心概念3.1、Pod 控制器 一、Kubernetes 概述 1、K8S 是什么 K8S 的全称为 Kubernetes (K12345678S)&…

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站,默认是走的 https,其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径,并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…

Postgresql数据类型-时间类型

PostgreSQL对时间、日期数据类型的支持丰富而灵活,本节介绍PostgreSQL支持的时间、日期类型,及其操作符和常用函数。 PostgreSQL支持的时间、日期类型如表所示。 我们通过一个简单的例子理解这几个时间、日期数据类型,先来看看系统自带的now…

70 内网安全-域横向内网漫游Socks代理隧道技术

目录 必要基础知识点:1.内外网简单知识2.内网1和内网2通信问题3.正向反向协议通信连接问题4.内网穿透代理隧道技术说明 演示案例:内网穿透Ngrok测试演示-两个内网通讯上线内网穿透Frp自建跳板测试-两个内网通讯上线CFS三层内网漫游安全测试演练-某CTF线下2019 涉及资源: 主要说…