C语言----汉诺塔问题

1.什么是汉诺塔问题

简单来说,就是有三个柱子,分别为A柱,B柱,C柱。其中A柱从上往下存放着从小到大的圆盘,我们需要借助B柱和C柱,将A柱上的所有圆盘转移到C柱上,并且一次只能移动一个圆盘,且在移动的过程中,大圆盘不能再小圆盘的上面。

2.思路分析

首先,我们的最终目的是将A柱上的圆盘全部转移到C柱上。则当A柱上只有一个圆盘,我们直接将A柱上的圆盘转移到C柱上就行了。

如下图所示

01f64242e3034f7cb36d3b3412af5e3d.png

45385a36be1a43a082664f30ff4a3ef0.png

当A柱上有多个圆盘时,就很复杂了,我们需要慢慢来分析。

当A柱上有2个圆盘时。我们要先将第一个圆盘转移到B柱上,然后再将第二个圆盘转移到C柱上,然后再将B柱上的圆盘转移到C柱上。

简化为 A->B   A->C   B->C。

如下图所示

d197cd4ebb694cc587fc602cc7bf6569.png

1c427cb81bfd4d81a1a3edde7f502a02.png

bffc2f3aa49a40d9be4f2efecec1cf05.png

4d2c05defe0e42058fd4ef07b77d82d1.png

当有3个圆盘时。

我们先将A盘上的第一个盘子转移到C柱,再将A柱上的第二个圆盘转移到B柱上,接着再将C盘上的圆盘转移到B柱上,再将A柱上的最后一个圆盘转移到C柱上,接着再将B柱上的第一个圆盘转移到A柱上,再将B柱上的最后一个圆盘转移到C柱上,接着再将A柱上的圆盘转移到C柱上,就完成了。

简化来说,A->C   A->B   C->B  A->C   B->A  B->C   A->C。

如下图所示  

72e98282dcc543c9bd7a04567de74aef.png

b95b0be7e2404998b36eb8d467357ebc.png

5861ebbe9b8e4e10ade3b6922dff2b7f.png

902dd8ec28ad45d883c76ac1c26f79ce.png

375a5bd897424d2ebf0412697cce75c0.png

da2829ea68524f689bc04b2d2fafbdac.png

bd4fe26ff48d4c8198c887e98b785d4a.png

78968d4ce12d4bf6a18b0e19be47e3e7.png

 通过2个圆盘和3个圆盘的例子发现,要向将A柱上的圆盘按要求转移到C柱上,我们要将n-1个圆盘全部转移到B柱上。

代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int count = 0;//全局变量做计数器
void move(char Tower_1, char Tower_2)
{
	printf("将 %c 移动到 %c \n", Tower_1, Tower_2);
	count++;
}
void Hanoi(int n, char Tower_1, char Tower_2, char Tower_3)
{
	if (n == 1)
		//是一个的话就直接从Tower_1移动到Tower_3
		move(Tower_1, Tower_3);
	else
	{
		//不是一个的话先借助Tower_3将Tower_1上面的n-1个移动到Tower_2
		Hanoi(n - 1, Tower_1, Tower_3, Tower_2);
		//完成此过程后Tower_1上面还有最后一个 
		move(Tower_1, Tower_3); //将Tower_1上面的最后一个移动到Tower_3
		//将Tower_2上面的n-1个通过Tower_1移动到Tower_3
		Hanoi(n - 1, Tower_2, Tower_1, Tower_3);
	}
}
int main()
{
	printf("请输入圆盘个数:\n");
	int n = 0;
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	printf("一共进行了%d次", count);
	return 0;
}

汉诺塔问题涉及到了递归的的问题,其里面有两个递归的过程,其实十分复杂的。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt QML】Qt Quick Scene Graph

Qt Quick 2是一个用于创建图形界面的库&#xff0c;它使用一个专门的场景图&#xff08;Scene Graph&#xff09;来进行渲染。通过使用OpenGL ES、OpenGL、Vulkan、Metal或Direct 3D等图形API&#xff0c;Qt Quick 2可以有效地优化图形渲染过程。使用场景图而不是传统的命令式绘…

1688工厂货源API接口:用于商品采集、商品搜索、商品详情数据抓取

item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品&#xff08;拍立淘&#xff09;item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_password 获得淘口令…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

神经网络怎么把隐含层变量融合到损失函数中?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

matplotlib和pandas与numpy

1.matplotlib介绍 一个2D绘图库&#xff1b; 2.Pandas介绍&#xff1a; Pandas一个分析结构化数据的工具&#xff1b; 3.NumPy 一个处理n纬数组的包&#xff1b; 4.实践&#xff1a;绘图matplotlip figure()生成一个图像实例 %matplotlib inline&#xff1a;图形直接在…

前端传递list(数组)类型参数,后端接收失败

一顿报错,我之前遇到的list都是Long类型 貌似用GET也是可以的,但是很奇怪一直报错 就是不可以 后来去百度 查询到可以用两种方法解决这个问题 1、拆开 传 以GET方式&#xff0c;后端GetMappingRequestParam接收。 2、以Post方式传&#xff0c;后端创建dto PostMappingReques…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下&#xff1a; 只粘贴了js方法哦&#xff0c; methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

光电探测器性能指标测试

光电探测器的三个核心指标&#xff1a; 带宽&#xff0c;转换增益&#xff0c;噪声(信噪比&#xff0c;NEP&#xff0c;噪声密度) 测试环境&#xff1a;可调谐激光器&#xff08;CW LASER&#xff09;&#xff0c;强度调制器(AM)&#xff0c;信号发生器(AWG)&#xff0c;可调衰…

【算法】滑动窗口——最大连续1的个数

本篇文章讲的是“最大连续1的个数”这道题&#xff0c;从最开始的简单暴力到用滑动窗口算法实现解题的思路历程&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.滑动窗口解法3.1优化一&#xff1a;end重返start优化&#xff0c;end指针不回退3.2优化二&#xff1a;某一st…

Day_2

1. 菜品管理 新增菜品 接口设计 1. 根据类型查询分类&#xff08;分类管理已完成&#xff09; 查看接口文档即可 2. 文件上传 创建Bucket 采用的是阿里云的OSS对象存储服务 新增AccessKey 3. 菜品的新增逻辑 代码开发 1. 文件上传接口开发 为了提高代码的解耦性&#…

Java_方法引用

方法引用就是把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体。 条件&#xff1a; 1.引用处需要是函数式接口 2.被引用的方法需要已经存在 3.被引用的方法的形参和返回值需要跟抽象方法的形参和返回值保持一致 4.被引用方法的功能需要满足当前的要求 简…

ATA-2161高压放大器用途有哪些种类

高压放大器是一种电子设备&#xff0c;其主要功能是将输入信号放大到较高的电压水平&#xff0c;同时保持信号的形状和特性。这种设备在各种应用领域中都有重要作用&#xff0c;它的种类繁多&#xff0c;根据不同的用途可以分为多种类型。 1.医学领域 在医学设备中&#xff0c;…

搭建Harbor仓库

文章目录 Harbor仓库搭建Harbor仓库安装 docker 服务修改配置文件 Harbor仓库 搭建Harbor仓库 下载 Harbor 仓库 安装 docker 服务 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-m…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…

《QT实用小工具·五十九》随机图形验证码,带有一些可人的交互与动画

1、概述 源码放在文章末尾 该项目实现了可交互的动画验证码控件&#xff0c;趣味性十足&#xff1a; 字符变换动画 噪音动画 可拖动交互 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef CAPTCHAMOVABLELABEL_H #define CAPTCHAMOVABLELABEL…

【影片欣赏】【指环王】【魔戒:护戒使者 The Lord of the Rings: The Fellowship of the Ring】

2001年发行&#xff0c;Extended DVD Edition Part One 1. Prologue: One Ring to Rule Them All… 2. Concerning Hobbits 3. The Shire 4. Very Old Friends 5. A Long-expected Party 6. Farewell Dear Bilbo 7. Keep It Secret, Keep It Safe 8. The Account of Isildur 9…

MyBatis入门例子

1、建立与数据库对应的POJO类 2、建立mybatis的配置文件 修改后如下&#xff1a; 3、创建POJO对象和Mysql数据的表之间的映射配置 4、建一个测试方法 实现从数据库中取数一条数据&#xff0c;封装成User对象返回 注意点&#xff1a; 这点&#xff0c;大家应该不陌生了&#x…

28-代码随想录18四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…

小米手机miui14 android chrome如何取消网页自动打开app

搜索媒体打开应用 选择你要阻止打开的app&#xff0c;以github为例 取消勾选打开支持的链接。 参考&#xff1a;https://www.reddit.com/r/chrome/s/JBsGkZDkRZ
最新文章