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.rhkb.cn/news/187590.html

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

相关文章

LeetCode(4)删除有序数组中的重复项 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 80. 删除有序数组中的重复项 II 1.题目 给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息,这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题: 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language,翻译为超文本标签语言,标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一,也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

Hadoop架构、Hive相关知识点及Hive执行流程

Hadoop架构 Hadoop由三大部分组成:HDFS、MapReduce、yarn HDFS:负责数据的存储 其中包括: namenode:主节点,用来分配任务给从节点 secondarynamenode:副节点,辅助主节点 datanode:从节点&#x…

评国青、优青、杰青,到底需要什么级别的文章?五篇代表作如何选?

一到年底就听同事们讨论到底申报“杰青”、“优青”还是“国青”,那么,“杰青”到底是什么呢?它和“优青”、“国青”又有什么区别呢? 杰青,全称“国家杰出青年基金获得者”,是国家自然科学基金里人才资助…

WAF入侵防御系统标准检查表

软件开发全文档获取:进主页

pyOCD

pyOCD 目录结构

在 Arduino IDE 2.0 中安装 ESP32 板(Windows、Mac OS X、Linux)

有一个新的 Arduino IDE——Arduino IDE 2.0(测试版)。在本教程中,您将学习如何在 Arduino IDE 2.0 中安装 ESP32 板并将代码上传到板。本教程与 Windows、Mac OS X 和 Linux 操作系统兼容。 据 Arduino 网站称:“ Arduino IDE 2.…

机器学习---多分类SVM、支持向量机分类

1. 多分类SVM 1.1 基本思想 Grammer-singer多分类支持向量机的出发点是直接用超平面把样本空间划分成M个区域,其 中每个区域对应一个类别的输入。如下例,用从原点出发的M条射线把平面分成M个区域,下图画 出了M3的情形: 1.2 问题…

局域网内部服务器访问外部网络

​ 一、环境说明 如下图所示,局域网1中的服务器是可以访问外网的,局域网2中的服务器发出的数据包经过中间路由可以到达局域网1中的服务器。现在有一种需求需要使局域网2中的服务器也要能访问外网,这里考虑采用如下方法来实现。 ​​ 二、软…

MySQL | 数据库的表的增删改查【进阶】

MySQL | 数据库的表的增删改查【进阶】 文章目录 MySQL | 数据库的表的增删改查【进阶】系列文章目录本节目标:数据库约束约束类型NULL约束UNIQUE:唯一约束DEFAULT:默认值PRIMARY KEY:主键FOREIGN KEY:外键CHECK 表的设…

JSON可视化管理工具JSON Hero

本文软件由网友 zxc 推荐; 什么是 JSON Hero ? JSON Hero 是一个简单实用的 JSON 工具,通过简介美观的 UI 及增强的额外功能,使得阅读和理解 JSON 文档变得更容易、直观。 主要功能 支持多种视图以便查看 JSON:列视图…

网易云音乐未登录接口返回301

网易云音乐 NodeJS 版 API (neteasecloudmusicapi.js.org) 上面是网易云音乐的官方API接口文档 当我调用接口发送请求的时候部分接口数据是需要登录之后进行获取的,但是当我发送请求的时候原生js项目中的跨端问题是比较难解决的。 遇到的问题:跨端请求…

启动Docker服务后显示Docker Engine stopped

1、重新启动Docker服务:打开Windows服务管理器(可以在开始菜单中搜索),找到"Docker Desktop Service"或类似命名的服务,右键单击并选择"重启"。稍等片刻,看看是否重新启动成功 2、尝试…

「我在淘天做技术」音视频技术及其在淘宝内容业务中的应用

作者:李凯 一、前言 近年来,内容电商似乎已经充分融入到人们的生活中:在闲暇时间,我们已经习惯于拿出手机,从电商平台的直播间、或者短视频链接下单自己心仪的商品。 尽管优质的货品、实惠的价格、精致的布景、有趣的…

最新宝塔面板第三方云端站点程序源码/第三方宝塔面板PHP源码/全开源ThinkPHP框架

源码简介: 实现宝塔面板第三方云端站点程序源码,这个是第三方宝塔面板 btcloud PHP源码,它还有云端使用记录、IP黑白名单、定时任务等功能。 这是一个使用PHP开发的宝塔面板第三方云端站点程序。 您可以利用此程序搭建属于自己的宝塔面板第三方云端&a…

使用切面实现前端重复提交(防抖)

使用切面实现前端重复提交(防抖) 代码结构定义注解请求锁切面处理器入参对象使用注解 代码结构 原理: 1、前端提交保存操作; 2、后端通过注解指定重复提交的关键字段进行识别,可以有多个; 3、拼接关键字段&…

HCIP---VRRP

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一. VRRP概述 VRRP---虚拟路由器冗余协议 VRRP(Virtual Router Redundancy Protocol)是一种用于在多个路由器之间创建虚拟路由器的协议。 VRRP使用了一系列协议来实现路…

Linux C语言进阶-D15递归函数和函数指针

递归函数 指一个函数的函数体中直接或间接调用了该函数本身 执行过程分为两个过程: 递推过程:从原问题出发,按递归公式递推从未知到已知,最终达到递推终止条件 回归阶段:按递归终止条件求出结果,逆向逐步…

更安全的ssh协议与Gui图形化界面使用

目录 前言: 一.Gui图形化界面的使用 二.ssh协议 SSH的主要作用包括: 相比其他网络协议,SSH的优势包括: 三.idea集成Git 前言: 上一篇讲解了git的命令用法以及https协议,但是这个协议放在做团队项目的…