一、题目描述:

现在有n个圆盘从上往下从小到大叠在第一根柱子上,要把这些圆盘全部移动到第三根柱子要怎么移动呢?请找出需要步骤数最少的方案因此我们可以将问题简化描述为:n个盘子和3根柱子:A(源)、B(目的)、C(备用),盘子的大小不同且中间有一孔,可以将盘子“串”在柱子上,每个盘子只能放在比它大的盘子上面。起初,所有盘子在A柱上,问题是将盘子一个一个地从A柱子移动到B柱子。移动过程中,可以使用C柱,但盘子也只能放在比它大的盘子上面。

二、算法思想:

汉诺塔问题是递归算法的典型代表,递归的本质是大而化小,利用的是计算机的堆栈来实现的。递归过程可以分为以下几步:

第一步:将n-1个盘子从A柱移动至B柱(借助C柱为过渡柱)
第二步:将A柱底下最大的盘子移动至B柱
第三步:将C柱的n-1个盘子移至B柱(借助A柱为过渡柱)

其中将n-1作为一个整体,假想进行操作,这里就利用的递归的思想,我们可以比作生活中的领导安排任务,领导将任务一层一层往下传递,领导都是不做具体的事,把落实放到最底层去,最底层然后一级一级往上汇报,最终完成领导的任务。

三、核心代码:

 void Hanoi(int n,char a,char b,char c)
{if(n==1)Move(n,a,b);//递归的出口else{Hanoi(n-1,a,c,b);//将n-1个盘由实参a移动到实参c(由函数形参可以看出,每次移动的是a和b,也就是Hanoi(n,a,b,c)中的前两个a和b。)Move(n,a,b);//将最大盘由a移动到b(函数实际起操作的部分,将形参a移动到b)Hanoi(n-1,c,b,a);//将n-1个盘由实参c移动到实参b(由函数形参可以看出,每次移动的是a和b,也就是Hanoi(n,a,b,c)中的前两个a和b。)}
}void Move(int n,char a,char b){printf("Move %d: from %c to %c\n",n,a,b);}

四、完整代码:

/*
汉诺塔问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define EPS 1e-6void Hanoi(int n,char a,char b,char c);void Move(int n,char a,char b);main(){int n=0;printf("please input the scale of Hanoi\n");scanf("%d",&n);Hanoi(n,'A','B','C');}void Hanoi(int n,char a,char b,char c)
{if(n==1)//递归的出口Move(n,a,b);else{Hanoi(n-1,a,c,b);//将n-1个盘由实参a移动到实参c(由函数形参可以看出,每次移动的是a和b,也就是Hanoi(n,a,b,c)中的前两个a和b。)Move(n,a,b);//将最大盘由a移动到b(函数实际起操作的部分,将形参a移动到b)Hanoi(n-1,c,b,a);//将n-1个盘由实参c移动到实参b(由函数形参可以看出,每次移动的是a和b,也就是Hanoi(n,a,b,c)中的前两个a和b。)}
}void Move(int n,char a,char b){printf("Move %d: from %c to %c\n",n,a,b);}

五、测试分析:

渣渣渣变渣渣系列(5)相关推荐

  1. 渣渣渣变渣渣系列(1)

    一.题目描述:(408联考 2010真题) 二.算法思想: 可以将这个问题看作是把数组ab转换为ba(a代表数组的前p个元素,b代表数组中的余下n-p个元素),先将a逆置得到a-1b,再将b逆置得到a ...

  2. 渣渣渣变渣渣系列(8)

    一.题目描述 二.算法思想: 本算法目的是求带权路径的长度,就是叶子节点的深度乘以叶子的权重之和.关键是如何求出每个叶子节点的深度,在这里最简单的方法就是利用递归算法. 三.核心代码: int WPL ...

  3. 渣渣渣变渣渣系列(6)

    一.题目描述: 二.算法思想: 本题的算法思想比较简单,因为题中已经给明数据结构,当后缀一样时,使用同一个存储空间,我们只需要想办法找出第一个两个链表的相同地址即可.本算法采用的方法是,首先将指针指向 ...

  4. 渣渣渣变渣渣系列(2)

    一.题目描述:(408联考真题 2011) 二.算法思想: 分别求两个升序序列A和B的中位数,设为a和b,求序列A和B的中位数过程如下: 1)若a=b,则a或b即为所求中位数,算法结束. 2)若a&l ...

  5. 渣渣渣变渣渣系列(4)

    一.题目描述: 二.算法思想: 本算法的关键在于利用两个指针,一个指针用来遍历计数,另一个指针用来指向n-k个值,即倒数第k个值. 三.核心代码: int search_k(int k,link*he ...

  6. 渣渣渣变渣渣系列(3)

    <strong>一.题目描述:</strong> 二.算法思想: 本算法的巧妙之处在于充分利用主元素的定义,即在序列中个数超过半数的元素.那么在动态统计的过程中,主元素出现的频 ...

  7. @字王2012·纵变体系列,共12款

    转载于:https://www.cnblogs.com/ziwang/archive/2012/05/23/9500463.html

  8. 交流信号隔离变送器(DIN导轨安装式)

    产品概述: 导轨安装DIN11交流电压隔离变送器,能将输入的交流信号按比例转换成4~20mA标准信号, 输入交流电压信号:输出为4~20mA直流电流信号或0~5VDC直流电压信号.实现辅助电源和输入输 ...

  9. 苹果呼叫转移设置不了_手机不关机!黑客教你设置手机变空号,开启真正免打扰!...

    怎么把手机号码设置成空号. 一般情况下不想接到电话,关机.飞行模式都能搞定,或者静音还你一片安静. 在王者荣耀排位赛中,此时手机忽然"女友来电",自动跳出游戏界面--快速挂断电话返 ...

最新文章

  1. 【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 )
  2. Python数据结构与算法—基本概念
  3. select、poll、epoll之间的区别
  4. 小程序canvasu真机上数据图片不能使用
  5. “约见”面试官系列之常见面试题之第八十五篇之css响应式(建议收藏)
  6. Android App罕见错误和优化方案
  7. Maven生命周期——2
  8. 快速失败(fail-fast)和安全失败(fail-safe)的区别
  9. 【日语】日语动词的敬体与简体
  10. Nacos安装讲解教程
  11. c语言健康指数,C-AHI——中国汽车健康指数
  12. android sit0 ip6tnl0,USB wifi调试笔记
  13. docker容器运行不退出的方法
  14. 后缀数组 相关问题模板
  15. 使用百度天气API制作天气组件
  16. superslide遇到jQuery(…).slide is not a function解决办法
  17. GPS卫星运动及定位matlab仿真
  18. Mac版本Redis可视化工具-Redis-Desktop-Manager
  19. 数据字典模板_C++ 模板元编程:一种屠龙之技
  20. 高并发,你真的理解透彻了吗?

热门文章

  1. _bss_start _armboot_start
  2. 颜色代码六位十六进制字符_8位十六进制颜色
  3. 海典ERP与汉码盘点机对接门店实时盘点计划及程序使用方法,实时盘点,云盘点方案
  4. 计算机Excel如何去表格线条,电脑中excel打印没有表格线的解决方法
  5. ACM 动态规划(简称dp) 分类
  6. ECRS标准工时测量软件分享:作业成本分析法如何计算?作业成本怎么分析计算
  7. 大规模MIMO系统中基于CSI的卷积神经网络定位
  8. numpy.unravel_index的作用和解释
  9. ios 如何生成cpp文件
  10. ac3165 linux驱动_为什么Linux系统没有类似Windows上的还原精灵和影子系统?