【C语言】汉诺塔问题
汉诺(Hanoi)塔问题:假设有命名为A、B、C的三个塔柱,初始时,在塔柱A上插有n个直径大小各不相同的圆盘,从上往下,圆盘从小到大编号为1、2、3、···n,要求将A柱上的圆盘移至塔柱C,可借助塔柱B,用程序模拟搬盘子过程。本程序要求用非递归算法的程序实现 (n<=6)。 圆盘移动必须遵守下列规则: 1:每次只能移动一个圆盘; 2:圆盘可以插在任意一个塔柱上; 3:任何时刻都不能将一个较大的圆盘放在一个较小的圆盘上。
输入格式:
正整数n。
输出格式:
搬盘子过程,每行一次搬动。
输入样例:
3
输出样例:
A->C
A->B
C->B
A->C
B->A
B->C
A->C
代码如下:
#include <stdio.h>
#include <stdlib.h>
//Hanoi
void Hanoi(int n, char A, char B, char C);int main()
{//设立盘子个数int n = 0;//输入盘子个数scanf("%d",&n);//递归函数Hanoi(n,'A','B','C');//传入ABC三个柱子 A:起始位置 B:经过位置 C:最终位置return 0;
}//move
void move(char x, char y) {//x:起始位置 y:终止位置printf("%c->%c\n",x, y);
}//Hanoi
void Hanoi(int n, char A, char B, char C) {//处理一个盘子if(n == 1) {move(A, C);}//处理n-1个盘子else {Hanoi(n - 1, A, C, B);//第一步将n-1个盘子从A经过C移到Bmove(A, C);//第二步将剩余盘子从A移到CHanoi(n - 1, B, A, C);//第三步将n-1个盘子从B经过A移到C}}
核心关键
作者:Fireman A
链接:https://www.zhihu.com/question/24385418/answer/257751077
来源:知乎对递归的理解的要点主要在于放弃!
放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
想象你来到某个热带丛林,意外发现了十层之高的汉诺塔。正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔。他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱。
你灵机一动,问道:“你该不会有个兄弟叫三傻吧?”
“对对,老爷你咋知道的?他会搬一到三号盘。“
”那你去把他叫来,我不需要你了。“
于是三傻来了,他也带着个草帽,上面有个3字。你说:”三傻,你帮我把头三个盘子移到c柱吧。“
三傻沉吟了一会,走进树林,你听见他大叫:”二傻,出来帮我把头两个盘子搬到C!“由于天气炎热你开始打瞌睡。朦胧中你没看见二傻是怎么工作的,二傻干完以后,走入林中大叫一声:“老三,我干完了!”
三傻出来,把三号盘从A搬到B,然后又去叫二傻:“老二,帮我把头两个盘子搬回A!”
余下的我就不多说了,总之三傻其实只搬三号盘,其他叫二傻出来干。最后一步是三傻把三号盘搬到C,然后呼叫二傻来把头两个盘子搬回C
事情完了之后你把三傻叫来,对他说:“其实你不知道怎么具体一步一步把三个盘子搬到C,是吧?”
三傻不解地说:“我不是把任务干完了?”
你说:“可你其实叫你兄弟二傻干了大部分工作呀?”
三傻说:“我外包给他和你屁相干?”
你问到:“二傻是不是也外包给了谁?“
三傻笑了:“这跟我有屁相干?”
你苦苦思索了一夜,第二天,你走入林中大叫:“十傻,你在哪?”
一个头上带着10号草帽的人,十傻,应声而出:“老爷,你有什么事?”
“我要你帮把1到10号盘子搬到C柱“
“好的,老爷。“十傻转身就向林内走。
“慢着,你该不是回去叫你兄弟九傻吧“
“老爷你怎么知道的?“
“所以你使唤他把头九个盘子搬过来搬过去,你只要搬几次十号盘就好了,对吗?“
“对呀!“
“你知不知道他是怎么干的?“
“这和我有屁相干?“
你叹了一口气,决定放弃。十傻开始干活。树林里充满了此起彼伏的叫声:“九傻,来一下!“ “老八,到你了!““五傻!。。。“”三傻!。。。“”大傻!“
你注意到大傻从不叫人,但是大傻的工作也最简单,他只是把一号盘搬来搬去。
若干年后,工作结束了。十傻来到你面前。你问十傻:“是谁教给你们这么干活的?“
十傻说:“我爸爸。他给我留了这张纸条。”
他从口袋里掏出一张小纸条,上面写着:“照你帽子的号码搬盘子到目标柱。如果有盘子压住你,叫你上面一位哥哥把他搬走。如果有盘子占住你要去的柱子,叫你哥哥把它搬到不碍事的地方。等你的盘子搬到了目标,叫你哥哥把该压在你上面的盘子搬回到你上头。“
你不解地问:“那大傻没有哥哥怎么办?“
十傻笑了:“他只管一号盘,所以永远不会碰到那两个‘如果’,也没有盘子该压在一号上啊。”
但这时他忽然变了颜色,好像泄漏了巨大的机密。他惊慌地看了你一眼,飞快地逃入树林。
第二天,你到树林里去搜寻这十兄弟。他们已经不知去向。你找到了一个小屋,只容一个人居住,但是屋里有十顶草帽,写着一到十号的号码。
【C语言】汉诺塔问题相关推荐
- c语言汉诺塔实验报告,C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那 ...
- c语言汉诺塔移动次数,C语言计算汉诺塔最小挪动步数 (二)
C语言计算汉诺塔最小移动步数 (二) 前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较 ...
- c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”
说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...
- 汉诺塔算法 c语言实验报告,C语言汉诺塔算法原理分析与实践
汉诺塔游戏的规则:如下图所示,有三个柱子A,B,C,我们要做的是把A柱的所有圆盘,全部转移到C柱上,转移时遵循的规则如下: 1.每次只能移动一个圆盘 2.所有的大圆盘必须在小圆盘的下面 首先假设只有一 ...
- c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
问题概述:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个老和尚想把64个盘子从A座移动到C座,但是规定每次只允许移动一个盘,且在移动过程中在 ...
- C语言--汉诺塔小游戏
汉诺塔小游戏的游戏规则:有三个柱子abc,其a柱上面有若干个圆盘,要求借助三个柱子将a柱上面的圆盘按顺序移动到c柱上去,并且c柱上每次只能增加一个圆盘,问需要移动多少次才可以完成此游戏. 一.首先理解 ...
- C语言 汉诺塔(hanoi)
代码 : #include <stdio.h>int m = 0;void move(char a, int n, char c) {printf("当前第%d步:", ...
- [C语言]汉诺塔|递归
问题:一共三根柱子,在一根柱子上从下往上按照大小顺序摞着n片圆盘,把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.(将A中圆盘全部移 ...
- C语言 - 汉诺塔详解(最简单的方法,进来看看就懂)
文章目录 一.什么是汉诺塔? 二.如何实现捏? 三.如何写代码? 四.为什么需要移动 2^n - 1 次/ 一.什么是汉诺塔? 汉诺塔起源于印度的一个古老传说,传说是什么不重要.重要的是它是怎么实现的 ...
- c语言汉诺塔动画程序,C语言实现的动画汉诺塔
/*本程序实现C上的汉诺塔动画移动效果,如有建议可和我联系,QQ:928853003*/ /*编写者:杰 */ /*完成时间:2012年9月25日9:02*/ /*有部分函数可参见easyx帮助,运行 ...
最新文章
- Java Swing Awt
- Ubuntu 安装 Qt 开发环境 简单实现
- 拆解前苏联产荧光数码管计算器,内部电路结构彪悍!
- Golang——数据类型转换(Sprintf、Format、Append方式转换)
- 比较全的log4j示例
- 1071-数字的空洞
- 中国实现量子计算第一个里程碑:原型机 “九章”比最快的超级计算机快一百万亿倍...
- 2个简单shell脚本(if,while,case语句)
- java学生管理系统登录注册_《Java》— 学生管理系统——登录界面
- python抓取电影海王影评词云生成
- 《腾讯传》五、荡清环宇,横扫外来者; 千夫所指,腾讯“三宗罪”
- Beyond Compare4破解方法
- 华为会员开放服务(Membership Kit),助力移动应用快速建设会员生态
- 基于Python3.6配置开发环境
- 什么样的语言可以进行反编译
- 微信小程序点击获取昵称头像
- 音频技术的下一个“热点”,会出现在哪个领域?丨一期一会 • 音频工程师专场
- RIP、OSPF、BGP、动态路由选路协议、自治域AS
- ros python 控制手柄数据发布频率
- 11.最长上升子序列(LIS)