什么是hanoi塔?

汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图

问题解答

问题定义
我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做C

hanoi`塔的搬运过程;
i :左边的柱子只有两个圆盘

我们先假设在A柱子上只有两个圆盘,不用图我们用大脑想象出来最佳流程就是,现在最小的放在B柱子上面然后把大的放在C上面,最后把B柱子上面的小圆盘放在C柱子上。

ii:左边的柱子上面有三个圆盘 过程如下图: `在这种情况下,我们可以把上面的两个圆盘看作是一个,然后又回到了i情况,下图展示了三个圆盘的转移过程` ![三个圆盘的hanoi过程](https://img-blog.csdnimg.cn/img_convert/f8d12ace981cf0cd72af4da2f57daaf1.png) iii:左边的柱子上有四个圆盘的时候 在这种情况我们通过作图做出hanoi的转移流程是很困难的了,我们可以用在`ii`中提及到的过程,就是我们先把上面的三个看作是一个,我们第一步的目的就是把前三个移动到中间的柱子上去。下面简单说一下转移步骤 1. 将A柱子上面的三个移动到B柱子上面(借助C柱子) 2. 将A柱子上面中最下面的圆盘移动到C柱子上面 3. 将B柱子上面的所有圆盘移动到C柱子上面(借助A柱子) 过程如下图: ![四个圆盘的hanoi](https://img-blog.csdnimg.cn/img_convert/7e80f4dd8a45878f9ae993e6a0fa6ea8.png) > 问题总结 > 通过上面的描述我们把hanoi移动的步骤一般化 >


  1. 将左边柱子上的N-1个圆盘移动带中间的柱子上
  2. 将第N个圆盘移动到最右边的柱子
  3. 将中间柱子上的所有圆盘移动到最右边的柱子

下面我们给出具体的代码

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); //step1
printf("%d move %c to %c \n",n,A,C);
hanoi(2,B,A,C);

只要理解了前两个对后面的理解也就不难了!还有一点题外话,当递归到程序注释的step1的时候,会为后续语句分配空间但不执行

hanoi塔还有一个进阶的题目就是判断当前的状态时第几个最优的状态,将在下篇文章进行讲述!

如果对我的文章感兴趣可以关注的公众号:云影原生。

hanoi塔问题解析(一) c++实现相关推荐

  1. Hanoi塔(分治法的应用)

    1.分治法 分治法的设计思想是将一个难以直接解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之. 一般来说,分治算法在每一层递归上都有3个步骤: (1)分解:将问题分解成一系列子问题. ...

  2. 二 用标准c语言实现hanoi塔问题,天大2016年1二月《数据结构》期末大作业考核要求.doc...

    数据结构要求:独立完成,作答时要按照模版信息填写完整,写明题型.题号:作答方式:手写作答或电脑录入,使用学院统一模版(模版详见附件):提交方式:以下两种方式任选其一,手写作答的同学可以将作业以图片形式 ...

  3. Hanoi塔(汉诺塔/梵天塔)问题

    Hanoi塔 汉诺塔(梵天塔/Hanoi)问题是计算机中比较典型的一个递归问题.废话不多说了,直接上代码. Python3.5代码 """重温本科学习过之书籍:计算机科学 ...

  4. 小知识系列(3):Hanoi塔(汉诺塔,河内塔)

    同样,借此来强化学习,但是说实话我写这个感觉很玄.Hanoi塔是昨天刚学到的东西,想了很久,感觉还是没有悟透,可能学到更多新东西,或产生了新的想法,或突然悟到了什么,届时会再做修改. 看了很多关于Ha ...

  5. 关于Hanoi塔的实现

    关于Hanoi塔的实现 首先,在此之前,我们需要了解一下递归这个东西: 在我看来,递归这个东西就是栈的进出: 向下:进栈 回溯:出栈 在进栈之前标记状态,输入到栈中: #include<bits ...

  6. 算法分析——Hanoi塔问题

    上图为 3 阶 Hanoi 塔 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C 并按同样的顺 ...

  7. 基础算法:Hanoi塔(递归)

    Hanoi塔 "递归算法离不开递推方程的求解." 这里Hanoi塔有三个柱子,A\B\C.上面放着五个盘子,要将A柱的盘子全部移到C柱上: 其中规则: 1.小圆盘必须在大圆盘上面. ...

  8. java hanoi塔问题_Hanoi塔问题 - 智障的个人空间 - OSCHINA - 中文开源技术交流社区...

    Hanoi塔问题--递归方法求解 假设有三个分别命名为x.y.z的圆柱形塔座,在塔座x上插有n个半径大小各不相同,以小到大由上而下编号为1,2,····,n,如图所示.现在要求将X轴上的n个圆盘移至塔 ...

  9. C++ Hanoi塔学习笔记(递归与非递归实现)

    自己学习理解的笔记,欢迎补充. 1.Hanoi塔问题的递归解法 void Hanoi(int n, char a, char b, char c) {if (n == 1) {cout << ...

最新文章

  1. tp3分布式session mysql_分布式数据库支持
  2. Activity的LaunchMode
  3. Pandas 数据挖掘与分析时的常用方法
  4. C语言过河问题主函数,c,c++_C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因?,c,c++,算法 - phpStudy...
  5. 【Git版本控制】Idea中设置Git忽略对某些文件的版本追踪(亲测)
  6. Android NDK工程创建与编译运行
  7. 2017.10.23 硬币购物 失败总结
  8. zookeeper入门综合概要介绍
  9. j2me 关于MIDP 读取jad文件
  10. 飞思卡尔单片机DZ60---TPM1\TPM2溢出中断
  11. js压缩文件或文件夹
  12. 权威DNS、递归DNS以及DNS相关排名
  13. 漫谈“中间件”与国产化【转】
  14. Linux学习和阿里云服务器的配置(感谢秦老师)
  15. 互联网思维笔记(一)
  16. I2C的基础概念和框架
  17. 数据分析、数据挖掘、数据运营有啥区别?【通俗版】
  18. 首发 华为Mate7青春版拆机换电池
  19. CA双向认证完整实现步骤(附java客户端代码)
  20. C++调用python,并抓取每日一句名言

热门文章

  1. 大学生英语竞赛大揭秘准备攻略
  2. IOCP的一些思考(粘包,断包的处理)
  3. 使用批处理创建windows计划任务
  4. 蓝牙模块HC-05 AT指令使用以及两个蓝牙模块的配对
  5. 2201: 逆置线性表(线性表)
  6. 答题小程序 服务器,答题小程序如何实现随机发题目
  7. 每周推荐阅读第一季结束
  8. 字体界的黑科技!输入数字立刻生成酷炫信息图的字体
  9. Flink 1.12.2 源码浅析 : JobGraph
  10. S5PV210 裸机开发驱动之LED灯