汉诺塔问题(包含了三台柱和四台柱)——C语言版本

news2024/11/25 8:21:27

目录

1. 什么是汉诺塔

2. 三座台柱的汉诺塔

2.1 思路

2.2 三座台柱的汉诺塔代码

3. 四座台柱的汉诺塔

3.1 思路

3.2 四座台柱的汉诺塔代码


1. 什么是汉诺塔

汉诺塔代码的功能:计算盘子的移动次数,由数学公式知,汉诺塔的盘子移动次数与盘子数n存在这样的关系,移动数 =2^{n} - 1(由递推得到),后面可以用这个公式来验证我们代码。

汉诺塔的规制:(1)有三根相邻的柱子,标号为A,B,C。(2)A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。(3)现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

2. 三座台柱的汉诺塔

2.1 思路

总结:我们想知道n个盘子的次数,记住了,在求解f(n)的时候,我们直接默认f(n - 1)已经完了就可以了!这个在前面已经解释过了,在此不再鳌述。我们将n-1个盘子当作一个整体:这就是类似于分治求解子问题的思想

那么当由3个盘子时,就有公式:f(3,x,y,z) = f(2,x,z,y),x->z,f(2,y,x,z);当有4个盘子时,就有公式:f(4,x,y,z) = f(3,x,z,y),x->z,f(3,y,x,z).从而推出f(n,x,y,z) = f(n,x,z,y),x->z,f(n,y,x,z)!
 

综上所述:也就是说我们想移动n个盘子,就需要先移动n - 1个盘子;移动n - 1个盘子,就需要先移动n - 2个盘子 ………………;移动2个盘子,就必须先移动1个盘子;

(1)而移动1个盘子就是递归的终止条件

(2)而n个盘子变成n - 1个盘子就是递归的大问题变成小问题的方法

2.2 三座台柱的汉诺塔代码

下列代码展示了盘子在柱子上移动的顺序:

下列代码展示了有n个盘子,至少移动几次:

对 (展示了有n个盘子,至少移动几次)解析:

ps:小伙伴们,图片将就着看吧哈哈哈,gif制作软件的免费用户是这样的w(゚Д゚)w!

 通过3个盘子,我们可以分析得:

(1)想先移动第3个盘子到最终位置,就必须先移动上面2个盘子;

(2)上面2个盘子总共移动了两趟,这就是2 * moveCount3(n - 1)的原因;

(3)最底下的盘子是移动了一次,这就是2 * moveCount3(n - 1) + 1的原因;

总结:

有n个盘子,上面n - 1个盘子需要移动两趟,而最底下,也就是第n个盘子是移动1次!!!

3. 四座台柱的汉诺塔

3.1 思路

算法思想:
用如下算法移动盘子(记为fourHanoi):
将A柱上n个盘子划分为上下两部分,上方部分共有m(1≤m≤n)个盘子,下方部分共有n - m个盘子。
步骤一:将A柱上面部分m个盘子使用fourHanoi算法经过C、D柱移至B柱。(此时C、D是中间柱)
步骤二:将A柱剩余的n - m个盘子使用threeHanoi算法经过C柱移至D柱。(此时C柱是中间柱)
步骤三:将B柱上的m个盘子使用fourHanoi算法经过A、C柱移至D柱。(此时A、C柱是中间柱)

这就有伙伴有疑问了,为什么不能全部都使用fourHanoi算法?

答:因为当fourHanoi算法将盘子转移到一定程度后,有个柱子上的盘子就不能动了,可以当作少了座台柱,也就是只能用threeHanoi算法移动其它盘子了。所以我们在计算的时候,就是在找fourHanoi算法将盘子转移到一定程度的临界值,也就是找多少个盘子能使用fourHanoi算法(找m)

根据算法的思想,可知:

(1)最优子结构性质:
四柱汉诺塔问题的最优解是用最少的移动次数将A柱上的盘子全部移到D柱上。当盘子总数为i时,我们不妨设使用fourHanoi的最少移动次数为f(i)。相应的threeHanoi 算法移动次数为g(n - m),由于g(n - m)=2g(n - m - 1)+1=2^(n - m) -1,当n - m确定时,g(n - m)也是不变的。
f(m)为最优解时,其子问题f(m - 1)也必为最优解。如果f(m - 1)不是最优解,那么存在f’(m - 1) < f(m - 1)。用f’(m - 1)替换f(m - 1)将产生一个比f(m)更优的解。这与f(m)为最优解是矛盾的。所以本问题具有最优子结构性质。

(2)递归地定义问题的最优解:

根据上述fourHanoi算法得到最少移动次数f(m):

①当n = 1时,有f(n) = 1

②当n > 1时,有f(n) = 2f(m) + 2^{n - m} - 1

3.2 四座台柱的汉诺塔代码

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

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

相关文章

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.1 整体效果演示、技术点

事件&#xff0c;在 Qt 中是很重要的一块内容&#xff0c;在实际工作中用到的也很多。 这里用一章的篇幅来讲解它。 本节先看下本章的一个总览&#xff0c;演示下所有效果&#xff0c;以及涉及到的一些技术点。 1.1 常用的事件讲解 整体效果如下&#xff1a; 详细讲解以下…

【学习笔记】C#基础 - 由C/C++衍生出来的面向对象的编程语言

一、程序结构 1、基本语法 using System; // C#程序第一条语句都是 using System; // using 关键字&#xff08;可多个&#xff09;&#xff1a;在程序中包含命名空间namespace RectangleApplication // namespace 声明&#xff08;可多个&#xff09;&#xff1a;包含一系列…

被删除并且被回收站清空的文件如何找回

文件的意外删除和回收站清空是许多用户面临的普遍问题。这种情况下&#xff0c;很多人会感到无助和焦虑&#xff0c;担心自己的重要文件永远丢失。然而&#xff0c;幸运的是&#xff0c;依然存在一些有效的方法能够帮助我们找回被删除并且被回收站清空的文件。 ▌被删除文件在…

【deepspeed】【训练】【交互】【wandb】训练过程中的wandb交互如何去除

问题&#xff1a;gpt模型训练时&#xff0c;中间有询问输入账户&#xff0c;交互式的询问影响自动执行脚本&#xff0c;询问是这样的&#xff1a; 解决办法&#xff1a; 在脚本中设置环境变量&#xff0c;关闭wandb&#xff0c;如下图&#xff1a; 其他&#xff1a; log中没有…

低代码框架开发平台厂家:做好产品,实现流程化办公!

在新的发展时代&#xff0c;低代码技术平台拥有诸多优势特点&#xff0c;成为广大企业实现降本、增效办公效率的得力助手。什么样的低代码框架开发平台厂家值得信任与青睐&#xff1f;都有哪些主要产品&#xff1f;为了帮助大家了解这一讯息&#xff0c;一起来了解流辰信息低代…

学习网络编程No.6【将服务器日志和守护进程化】

引言&#xff1a; 北京时间&#xff1a;2023/9/1/21:15&#xff0c;下午刚更新完博客&#xff0c;同理再接再厉&#xff0c;这样整天不需要干什么&#xff0c;除了玩手机的日子不多了&#xff0c;马上就要开学&#xff0c;每天需要签到签退的日子就要来临&#xff0c;烦躁&…

原生小程序Donut多端开发

原生小程序Donut多端开发 原生小程序 Donut 多端&#xff1a;跨平台开发的新选择 随着移动应用开发的不断发展&#xff0c;跨平台开发成为了一个备受关注的话题。开发人员希望能够使用一套代码库&#xff0c;同时支持多个平台&#xff0c;从而提高开发效率并覆盖更广泛的用户群…

移除数组中指定元素的所有数

给你一个数组 nums 和一个值 val&#xff0c;你需要 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 思路1&#xff1a;暴力查找——覆盖法&#xff0c;遇到一次val就挪动后面的数据删除 代码 int removeElement(int* nums, int numsSize, int val) {int…

英国入境前需要准备什么?

英国&#xff0c;这个位于欧洲北部的岛国&#xff0c;以其悠久的历史、文化和美丽的风景而闻名于世。无论是旅游观光、留学深造&#xff0c;还是商务差旅&#xff0c;前往英国都需要进行一些入境前的准备工作&#xff0c;以确保您的旅行顺利进行。下面&#xff0c;知识人网小编…

uniapp之uni-forms表单组件封装的双向数据绑定

前言 在uniapp中, 封装组件的props单向数据流更为严格, 不允许改变子组件的props属性, 所以记录下uniapp下的form表单的组件是如何封装的, 双向数据是如何绑定的. 版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7&quo…

xshell---git上传文件到gitee远程仓库配置

1.git下载 如果没有xshell下没有下载过git&#xff0c;可以参考这篇的教程&#xff1a;Linux配置安装 git 详细教程 下载后可以通过 git --version 查看git的版本号&#xff0c;验证是否安装成功 2.新建仓库 首先需要在gitee上注册一个账号 然后再主页面点击右上边框的 号…

uniapp——实现聊天室功能——技能提升

这里写目录标题 效果图聊天室功能代码——html部分代码——js部分代码——其他部分 首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 效果图 聊天室功能 发送图片 …

《C++ Primer》第3章 字符串、向量和数组(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 3.5 数组&#xff08;P101&#xff09; 数组类似于 vector &#xff0c;不同点在于数组的大小固定不变&#xff0c;在某些情况下性能较好&#xff0c;但灵活性较差。 3.5.1 定义和初始化内置数组&#xff…

一文了解袋鼠云在实时数据湖上的探索与实践

近日&#xff0c;袋鼠云大数据引擎专家郝卫亮&#xff0c;为大家带来了《袋鼠云在实时数据湖上的探索与实践》主题分享&#xff0c;帮助大家能了解到什么是实时数据湖、如何进行数据湖选型及数据平台建设数据湖的经验。 如今&#xff0c;大规模、高时效、智能化数据处理已是“…

阿里云新用户:定义,专享福利及优惠活动

随着云计算技术的快速发展&#xff0c;越来越多的个人与企业开始将业务迁移到云端。阿里云作为国内领先的云计算服务提供商&#xff0c;为新用户提供了一系列专享福利和优惠活动。本文将详细介绍阿里云新用户的定义、专享福利和优惠活动&#xff0c;助力大家轻松上云&#xff0…

OPCAE接口

目录 1 主要接口 1.1 OPCEventServer对象 1.2 OPCEventSubscription对象 1.3 OPCEventAreaBrowser对象&#xff08;可选&#xff09; 1.4 自定义接口开发注意 2 OPCEventServer 2.1 接口介绍 2.2 接口方法 3 IOPCEventServer2 3.1 接口介绍 3.2 接口方法 4 IConnect…

堆排序(Topk问题)

1.堆排序 堆排序是在堆的思想上面进行延伸的一种排序方法,原理就是利用堆的特性. 堆排序首先得建堆,这里建堆有一个原则: 升序建大堆降序建小堆 利用堆删除的思想来进行排序: 建堆和堆删除都可以使用向下调整的方法来实现 堆删除的向下调整和建堆的向上调整在堆的实现这篇博…

快速搭建超轻量级图床——Cpolar+和树洞外链

文章目录 1.前言2. 树洞外链网站搭建2.1. 树洞外链下载和安装2.2 树洞外链网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语…

MT6785(Helio G95)安卓核心板_联发科4G高能低耗安卓主板开发板

MTK6785&#xff08;Helio G95&#xff09;安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核&#xff0c;主频高达 2.05GHz&#xff0c;外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供&#xff0c;速度可提升至 900MHz 。高达 10…

【高效开发工具系列】Fork版本管理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…