hanoi塔问题解析(一) c++实现
来源:互联网 发布:连云港联通网络 编辑:程序博客网 时间:2024/05/16 06:30
什么是hanoi塔?
汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图
问题解答
问题定义
我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做C
hanoi`塔的搬运过程;
i :左边的柱子只有两个圆盘
ii:左边的柱子上面有三个圆盘
过程如下图: 在这种情况下,我们可以把上面的两个圆盘看作是一个,然后又回到了i情况,下图展示了三个圆盘的转移过程
iii:左边的柱子上有四个圆盘的时候
在这种情况我们通过作图做出hanoi的转移流程是很困难的了,我们可以用在ii
中提及到的过程,就是我们先把上面的三个看作是一个,我们第一步的目的就是把前三个移动到中间的柱子上去。下面简单说一下转移步骤
1. 将A柱子上面的三个移动到B柱子上面(借助C柱子)
2. 将A柱子上面中最下面的圆盘移动到C柱子上面
3. 将B柱子上面的所有圆盘移动到C柱子上面(借助A柱子)
过程如下图:
问题总结
通过上面的描述我们把hanoi移动的步骤一般化
- 将左边柱子上的
N-1
个圆盘移动带中间的柱子上 - 将第N个圆盘移动到最右边的柱子
- 将中间柱子上的所有圆盘移动到最右边的柱子
下面我们给出具体的代码
void hanoi(int n,char A,char B,char C){ if(n<=1) { printf("1 move %c to %c\n",A,C); return ; } hanoi(n-1,A,C,B); printf("%d move %c to %c \n",n,A,C); hanoi(n-1,B,A,C);}
不要在看了,这就是全部代码了。已经没有了
╭︿︿︿╮
{/ o o /}
( (oo) )
︶ ︶︶
以上是对hanoi塔的总体概述,下面就要聊一聊真正的代码流程!
代码详解
hanoi(n,A,B,C)
代表的意义就是讲n个圆盘从A移动到C借助B;
* 当n
等于1的时候,就代表把当前A中最大的圆盘直接从A移动到C
* 当n
等于2的时候,就调用hanoi(2,A,B,C)
也就是执行下面的三个步骤下面就是本文中重点了
1. 调用honoi(1,A,C,B)
就是相当于把B柱和C柱交换了
2. 执行打印语句,不进行继续调用。所以不用交换柱子
3. 调用hanoi(1,B,A,C)
相当于把B柱和A柱交换了
上面的语句可以表述为:
hanoi(1,A,C,B); printf("%d move %c to %c \n",n,A,C);hanoi(1,B,A,C);
这就是对代码的解释!
当圆盘更多的时候无非就是进行递归知道递归到上面的状态,比如有三个圆盘的时候,调用的是:
hanoi(2,A,C,B); //step1printf("%d move %c to %c \n",n,A,C);hanoi(2,B,A,C);
只要理解了前两个对后面的理解也就不难了!还有一点题外话,当递归到程序注释的step1
的时候,会为后续语句分配空间但不执行!
hanoi塔还有一个进阶的题目就是判断当前的状态时第几个最优的状态,将在下篇文章进行讲述!
- hanoi塔问题解析(一) c++实现
- Hanoi(汉诺)塔问题(C实现)
- Hanoi塔问题(C)
- hanoi塔问题解析(二)
- Hanoi塔问题 栈与递归C语言编程实现
- hanoi(汉诺)塔问题C++的递归实现
- Hanoi双塔问题(hanoi)
- 数据结构C语言版之Hanoi塔问题
- 汉诺(Hanoi)塔问题
- Hanoi(汉诺)塔问题
- 汉诺塔问题(Hanoi塔)
- Hanoi(汉诺)塔问题
- c语言实现Hanoi塔移动步骤
- n阶Hanoi塔问题 递归实现
- 栈与递归实现Hanoi塔问题
- 递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)
- 汉诺塔(Hanoi)问题递归算法实现
- 实现汉诺塔(Hanoi)问题(堆栈、递归)
- win10优化
- Py第九问 python 变量命名规范
- NOIP2016模拟-1014T2 Rabbit Number
- 异常没有输出到日志
- ShaderLab基础(Queue标签)
- hanoi塔问题解析(一) c++实现
- NPM常用命令
- 动态JavaWeb项目连接Tomcat服务器的问题
- https是如何工作的?
- Python包管理工具pip安装
- 设计模式之Java自定义观察者模式
- iOS emoji表情过滤
- 能让你少写1000行代码的20个正则表达式
- MySQL索引原理及慢查询优化