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

news2025/1/8 5:35:05

 今天与大家分享一下如何用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移到C
	else
	{
        //每次都有三个动作
		Han(n - 1, a, c, b); //把n-1个盘子,从a通过c移到b
		move(a, c);          //把第n个盘子从a移到c
		Han(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移到C
	else
	{
		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.coloradmin.cn/o/1189121.html

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

相关文章

js堆栈函数及断点调试(简单使用,仅供自己参考)

第一步打开调试面板点击源代码tab再点击webpack找到自己写的代码(以vue项目为例,构建完后的项目是不能调试的) 第二步在你需要调试的地方点击一下卡个点,如上图所示,然后刷新网页 第三步,点击调试操作箭头…

商人宝:新版收银系统比传统的收银机有哪些优势

新版收银系统凭借安装迅速、使用便捷、升级省心等特点,正逐步替换掉传统的安装下载的C/S架构的收银系统。今天,小编为大家分享新版收银系统对比传统收银机的三大优势。欢迎大家点赞关注,以及收藏本文章,以便后续多了解。 一是网页…

华为两大旗帜性人物相继发声!透露出哪些重要信息?

近几年,“算力”一词越来越频繁地出现在我们的视野中,随着数字化与智能化进程的加快,对于算力的要求越发迫切。 不知道朋友们有没有关注到,近日华为两大旗帜性人物,在短时间内也相继谈及算力...... 01 、华为持续加码…

这8个图片素材库,真的免费下载,4K无水印

不会还有人不知道去哪里下载高质量图片素材吧,给大家推荐8个网站,免费下载,以后的图片素材都不用愁了,赶紧收藏起来! 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 一个很大的素材库,站内主…

数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台

数字孪生,是一种利用物理模型、传感器数据、运行历史等信息,在虚拟空间中构建实体对象或系统的精确映射,从而实现对其全生命周期的仿真、优化和管理的技术。数字孪生可以应用于各个领域,如工业制造、智慧城市、医疗健康、教育培训…

Linux-命令行命令

注:[]的内容说明是可选的 1.ls ls [-a -l -h] [Linux路径] >如果没有参数,就展示当前工作目录的内容 > -a:all的意思,即列出所有文件(包含隐藏文件/文件夹) > -l:以列表形式展示内容&…

怎么建模HEC-RAS【案例-利用HEC-RAS分析河道建筑对洪水管控的作用】 洪水计算、堤防及岸坡稳定计算、冲淤分析、壅水计算、冲刷计算、水工构筑物建模

背景介绍 人口数量的增长、不合理的区域规划和无计划的工程实践,让洪水对于人类而言变得极具风险。 为了最大程度地减少洪水造成的损害,采取管控措施往往需要在初期执行,为了研究这些管控措施,需要确定河段桥梁和作为调节的水利设…

基于springboot实现福聚苑社区团购平台系统项目【项目源码】计算机毕业设计

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

畜牧猪舍养殖成功 管理效率提高的背后原因

畜牧养猪远程监控方案 畜牧养猪物联网远程监控方案其目的是为了提高养猪场的管理效率,降低生产成本,提高猪肉质量和养殖安全。现有的方案通常包括传感器和无线网络设备,这些设备可以监测养猪场的温度、湿度、气体浓度、环境光照等指标&#…

【bug】vue create 项目名,bash: vue: command not found

创建项目的时候,报bash: vue: command not found 一步一步排查 1、node是否安装,node -v 2、不是node的问题,试试npm install -g vue/cli,安装脚手架,其实这里是正在安装的意思,但是速度比较慢&#x…

物联网水表电子阀工作原理是怎样的?

随着科技的不断发展,物联网技术逐渐深入到我们的生活之中。作为智能家居的重要组成部分,物联网水表电子阀凭借其智能化、节能环保等优势,受到了越来越多用户的青睐。接下来,合众小编将来为大家介绍下物联网水表电子阀工作原理。 一…

载波通讯电表的使用年限是多久?

随着科技的飞速发展,智能家居、物联网等概念逐渐深入人心,载波通讯电表作为一种新型的智能电表,凭借其低功耗、高可靠性、远程通讯等优点,广泛应用于居民用电、工业生产等领域。那么,载波通讯电表的使用年限是多久呢&a…

【第2章 Node.js基础】2.4 Node.js 全局对象...持续更新

什么是Node.js 全局对象 对于浏览器引擎来说,JavaScript 脚本中的 window 是全局对象,而Node.js程序中的全局对象是 global,所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

split() 函数实现多条件转为数据为数组类型

使用 split() 函数并传递正则表达式 /[,;.-]/ 作为分隔符来将字符串按照逗号、分号和破折号进行拆分,并将结果赋值给 splitArray 数组。下面是一个示例代码: 在上面的示例中,我们使用 split() 函数将 inputString 字符串按照逗号、分号和破折…

VMware 虚拟机如何修改虚拟机系统的网卡速率为万兆——筑梦之路

1. 找到虚拟机系统安装目录 比如E:\vmware-system\kali\ 2. 找到vmx文件,用记事本打开 将 ethernet0.virtualDev "e1000" 这行改为 ethernet0.virtualDev "vmxnet3" 后保存(注意vmxnet3全为小写),如果没…

在vue3框架中使用vant的input组件安卓端闪退的问题

问题复现 网站首页跳入其他页面,使用vant的input组件导致input框在手机端点击之后闪退,测试使用的苹果手机,测试没出现问题,电脑上点击也没有问题,但是上了生产之后安卓手机大量用户反馈输入框不能点击,后来…

如何在JVS低代码表单配置中实现数据的高效管理?

在数字化时代,表单已经成为企业、机构和个人收集、整理、分析数据的重要工具。然而,随着数据复杂性的增长,传统的单一表单往往难以满足需求。JVS低代码表单引擎中子表格允许在主表单中嵌套另一个子表数据,使得数据的收集和组织更加…

小白该如何学习Linux操作系统?

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 Linux作为一种开源操作系…

SuperMap iDesktopX基于地形DEM数据做最佳路径分析

问题1: 现有某山区的DEM高程数据,以及该地区电塔位置数据(DT)、电力维护工作基地(GZJD)(电力工作人员的工作居住地)。为了安全稳定的供电,电力工程师需要随时对所有的电塔进行检查维护。为了减少工作人员在路上的耗费,我们需要根据地形、电塔和工作基地的位置点来进行路径分…

学术论文的实证数据来源

一、引言 在当今的学术研究中,数据是至关重要的。无论是自然科学、社会科学还是人文科学,都需要借助数据来支撑和证明其研究假设和理论。然而,数据的来源却是多种多样的,而且不同的学科领域也有其特定的数据来源。本文旨在探讨论文…