Hanoi汉诺塔问题

【算法设计与分析】双色汉诺塔问题 C++【问题描述】设 A、B、C 是 3 个塔座。开始时,在塔座 A 上有一叠共 n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为 1,2,… 开始时,在塔座 A 上有一叠共 n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座 A 上的这一叠圆盘移到塔座 B 上,并仍按同样顺序叠置。【输出形式】每一行由一个正整数 k 和 2 个 字符 c1 和 c2 组成,表示将第 k 个圆盘从塔座 c1 移到塔座 c2 上。规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至 A,B,C 中任一塔座上。规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 阅读详情

Hanoi汉诺塔

汉诺塔问题:

设A,B,C是三个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自上到下,由大到小地叠放在一起。现要求将塔座A上的这一叠圆盘移动到塔座C上 ( 可以借助于塔座B),仍按同样的顺序叠置。规定:每次只能移动一个圆盘,任何时刻不允许将较大的圆盘压在较小的圆盘之上。



例如  n = 3 时,有:



我们讨论对于n个圆盘,至少需要多少次可以从A移动到C,设 用Tn 来表示这个最小值。对于n = 0 ,显然 T0 = 0  ,对于 n = 1 , T1 = 1,对于 n = 2 ,T2 = 3
由上图 T3 = 7 。 
我们可以得到一个递归式:
T0 =  0
Tn = 2Tn-1 + 1     n > 0
我们可以使用递归式计算对于任意一个给定的 正整数 n ,但是当 n 很大时,使用递归式计算就比较耗时了(递归式不是封闭形式的),我们能不能得到一个封闭的形式来计算
Tn呢? 答案是肯定的:
T3 = 2 * 3  +  1
T4 = 2 * 7  +  1
T5 = 2 * 15 + 1
T6 = 2 * 31 + 1
看起来好像 Tn = 2的n次方  -  1    n > = 0
我们利用数学归纳法可以很容易的证明其正确性: T0 = 2 的0次方 - 1 = 0      n> 0 时  Tn = 2 Tn-1 + 1 = 2(2的n-1次方 - 1 )+ 1 = 2 的n次方 - 1
利用上式我们就很容易计算移动的最少次数了。

下面我们使用C语言来模拟这个过程:
<span style="font-size:14px;">#include<stdio.h>
int times = 0; //用于记录移动次数
void hanoi(int n,char A,char B,char C)
{
	times += 1;
	if(n==1)
	{
		printf("Move disk %d from %c to %c\n",n,A,C);
	}
	else
	{
		hanoi(n-1,A,C,B);
		printf("Move disk %d from %c to %c\n",n,A,C);
		hanoi(n-1,B,A,C);
	}
}
int main()
{
	int n;
	printf("请输入圆盘个数n\n");
	scanf("%d",&n);
	hanoi(n,'A','B','C');
	printf("总共需要次数为:%d\n",times);
	return 0;
}</span>




Java实现Hanoi(汉诺塔)问题 Hanoi问题简述: 将A上的n个圆盘借助B移到C上,求需要移动的次数or打印移动过程 递归的经典问题,问题详细就不多说了。 求解:问题分解: (1) 将A上的N-1个盘移动到B上 (2) 将B上的N-1个盘再移动到C上 以上即显示了递归思想:将父问题分解为2个子问题 Hanoi(1) = 1 Hanoi(n) = 2*Hanoi(n-1) + 1; 其中1:盘n由A–>C的一次操作 实现 ... 阅读详情

相关推荐

汉诺塔问题 hanoi tower (递归)。

又来填坑了。 还是递归问题,这次是汉诺塔。 题意是这样的:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,并输出移动的步骤。 由用户自定义输入金盘的个数n。 可以测试数据:当n=3时,自己模拟一下移动的步骤; 例如: 当A柱子上有3个从

Zelda 的博客 3155

Hanoi塔问题

设A,B,C是三个塔座。开始时,在塔座A上有一叠共n个圆盘,这些圆盘自上而下,由大到小地叠在一起,各圆盘从小到大编号为1,2,。。。,n。现要求将塔座A上的这一叠圆盘移到塔座B上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1)每次只能移动一个圆盘; 规则(2)任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3)在满足移动规则(1)和(2)的前提下,可将圆盘移至A,B

3240

递归巧解汉诺塔问题(hanoi)

/* hanoi问题:在source处的盘子通过help处到达target source:一开始所处的位置 help:盘子可以借助的地方 target:到达的地方 n:盘子的个数 */ void hanoi(int n, char source, char help, char target) { x++; //如果只有一个盘子,从source到target就好了 if (n == 1) cout << source << "->" << target &

weixin_50731537的博客 1412

汉诺塔问题-递归实现

问题描述  设A,B,C是3个塔座。开始时,在A上有n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n。  问题:现要求将A上的这一叠圆盘移到B上,并仍按同样顺序叠置。  在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足规则1,2的前提下,可将圆盘移至A,B,C中任一塔座上。 解题思路     1. 将上面n-1个盘子从A座移到C座     2. 将1个盘子(最底下的、最大的盘子)

迷雾总会解 1077

算法设计—汉诺塔问题

设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 每次只能移动1个圆盘; 任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。

双色Hanoi塔问题参考代码

双色Hanoi塔问题 Time Limit:3000MS Memory Limit:65536K Total Submit:320 Accepted:163 Description A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小 地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色, 如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘 时应遵守以下移动规则: 规则(1):每次只能移动1个圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):任何时刻都不允许将同色圆盘叠在一起; 规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。 试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置 。 编程任务: 对于给定的正整数n,编程计算最优移动方案。 Input 输入由多组测试数据组成。每组测试数据的第1 行是给定的正整数n。 Output 对应每组输入,输出的每一行由一个正整数k和2 个字符c1 和c2 组成,表示将第k 个圆盘从塔 座c1 移到塔座c2 上。 Sample Input 3 Sample Output 1 A B 2 A C 1 B C 3 A B 1 C A 2 C B 1 A B

汉诺塔问题-递归

最近看了一下递归的经典问题汉诺塔问题,并且自己用java实现了一下。 首先我们来看一下问题的描述:设 a b c 是三个塔座。开始时,在a塔上有一叠共n个圆盘,这些圆盘自上而下,由小到大的叠放在一起,个圆盘从小到大的编号为1,2,3…n,如图,现要求将塔座a上的所有圆盘都移动到塔座b上,并仍按同样的顺序叠置。在移动圆盘时应该遵循以下移动规则: 规则(1)每次只能移动一个圆盘。 规则(2)任何时刻都...

qq_43493208的博客 1274

双色Hanoi塔问题

Description A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1):每次只能移动1个圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):任何时刻都不允许将同色圆盘叠在一起; 规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。 试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。 编程任务: 对于给定的正整数n,编程计算最优移动方案。 Input 输入由多组测试数据组成。每组测试数据的第1 行是给定的正整数n。 Output 对应每组输入,输出的每一行由一个正整数k和2 个字符c1 和c2 组成,表示将第k 个圆盘从塔座c1 移到塔座c2 上。 Sample Input 3 Sample Output 1 A B 2 A C 1 B C 3 A B 1 C A 2 C B 1 A B */

汉诺塔(Hanoi)问题归纳总结

汉诺塔问题递归、非递归算法、启发式算法解决汉诺塔,双色汉诺塔...

qq_53162179的博客 4万+

分治法实现双色汉诺塔

A、B、C是3个塔座。开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着红色,偶数号圆盘着蓝色,如图所示。现要求将塔座A上的这一叠圆盘移到塔座B上,并仍按同样顺序叠置。

双色Hanoi塔问题 对于给定的正整数n,编程计算最优移动方案

A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1):每次只能移动1个圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):任何时刻都不允许将同色圆盘叠在一起; 规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。 试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。

Hanoi汉诺塔 问题

今天编写了一下Hanoi汉诺塔

ly2863259095的专栏 648

汉诺塔问题

汉诺塔问题

汉诺塔问题(Hanoi Tower)

要把64个圆盘从a柱子移动到c柱子上,第一步应该怎么做?能立即确定的是最后一步:最后一步的盘子肯定也是a最上面那个圆盘,并且是由a或b移动到c——此前已经将63个圆盘移动到了c上。因此可以采用相同的方法,先将上面的62个盘子由b移到a,再将最下面的盘子移到c……先假设除最下面的盘子之外,我们已经成功地将上面的63个盘子移到了b柱,此时只要将最下面的盘子由a移动到c即可。也许你已经发现规律了,即每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。

m0_56616281的博客 349

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 332

Dify+MCP Server打造禅道AI智能助手

Dify AI与MCP Server结合打造的禅道AI智能助手,实现了项目管理智能化升级。该方案通过大语言模型和自动化工作流,提供四大核心功能:1)自动化报表生成,支持多维度数据统计与可视化;2)禅道系统管理操作,简化产品/项目/任务管理流程;3)基于知识库的智能问答系统;4)数据库灵活查询与可视化输出。系统采用分层架构,通过MCP协议实现AI与数据源解耦,解决了传统禅道在数据孤岛、工具碎片化等问题。实际应用验证了其在用户管理、任务创建、Bug处理等场景的高效性,显著提升了项目管理效率。

oNew_Lifeo的博客 1708

【例3】Hanoi汉诺塔问题

       有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上N个盘子搬移到C柱去的方法。 【输入数据】    &n...

developer_zhb的博客 679

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 270

算法学习之汉诺塔(Hanoi)问题

汉诺塔(Hanoi)问题 利用了递归算法,先将n个圆盘转化为n-1个圆盘来解决,以此类推,直到只剩下一个圆盘即可开始移动 //java 实现function public static void Hanoi(int n , char a ,char b,char c){ //盘子数以及三个柱子名 if(n==1){ move(n,a,b); //当递归到最上方的圆盘时,直...

weixin_44198475的博客 254

实战STM32G0驱动DRV8870/AT8870:PWM+DMA精准调速与H桥衰减模式详解

本文详细介绍了如何使用STM32G0单片机结合DRV8870/AT8870电机驱动芯片实现直流有刷电机的精准控制。重点讲解了PWM与DMA结合实现高效调速的硬件配置与软件驱动方法,并深入剖析了H桥快衰减与慢衰减模式的工作原理及应用场景,为嵌入式电机控制项目提供了完整的实战解决方案。

c7d8e9的博客 595

锐捷交换机堆叠配置举例

一、组网需求: 1)四台S2628G进行堆叠; 2)设备在堆叠前先设置好优先级; 3)使用光口堆叠的设备如RG-S2928G-E相关配置 二、组网拓扑 三、配置要点: 普通堆叠设备不需要配置,只要把堆叠模块和线缆连接好即可 堆叠模块不支持热插拔,即插在模块连上线缆后不能立即生效,需要重启设备才生效。 如果拔掉堆叠插槽后,想再插上模块堆叠,那么必须重启设备才生效 设备堆叠需要协商参数,时间会比较久,请耐心等待 堆叠时设备建议是...

dongsheng_9234的专栏 8283

汉诺塔(hanoi)问题从0到1详解

汉诺塔问题详细解析每一步只能移动一个盘子,同时必须满足大盘子在小盘子的下面。有没有人会和我一样,看到这个问题就会想到这个问题是怎么形成的呢?是谁提出来的呢?或者是来源是呢?于是我查询了一下,跟大家简单叙述一下。传说在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。

weixin_67596609的博客 2619

第 13 章:Spring AI Alibaba MCP 与 Nacos3 — 企业级MCP服务

理解Spring AI Alibaba 框架下的MCP服务与Nacos注册中心整合的必要性,学会Spring AI Alibaba-基于Nacos的MCP实现方法

paopao_wu的专栏 788

Tower Of Hanoi - 汉诺塔问题(C语言)

汉诺塔是个什么玩意儿啊?解决问题用的啥思想啊?用代码表示解决方案咋写啊?是咋样个运行过程啊?这位客官,咱里边儿请,坐下来且听我娓娓道来~

2301_80029060的博客 623

39-高级优化技术:指令调度与乱序执行 - 手把手教你手写CPU

本文介绍了现代处理器设计中提高指令级并行性(ILP)的两种关键技术:指令调度和乱序执行。指令调度分为静态调度(由编译器完成)和动态调度(由硬件完成),后者能更好适应运行时情况但复杂度更高。乱序执行通过动态重排指令顺序提高硬件利用率,其核心组件包括重排序缓冲区、保留站和寄存器重命名。文章提供了保留站的Verilog实现示例,并分析了不同优化技术在性能、硬件开销和功耗方面的权衡。最终指出,CPU设计需根据性能、功耗等需求选择合适的优化技术。

2301_79143213的博客 85

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 250
上一篇: 编译原理:第二节
下一篇: 编译原理:第三节
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值