问题描述:
如下图所示,有A、B、C三根柱子,其中A柱子上面有从小到大的共n个圆盘,现要求将A柱子上的圆盘移到C柱子上,在移动盘子的过程中遵循一次只能移动一个盘子,并且在每个柱子上都不能出现大盘子在小盘子上面,求移动次数最少的移动路线。

例如,
n=1时,最少移动次数的路线为:A->C
n=2时,最少移动次数的路线为:A->B,A->C,B->C
n=3时,最少移动次数的路线为:A->C,A->B,C->B,A->C,B->A,B->C,A->C
……

递归算法思想:
假如有n个盘子,从上到下n-1个盘子看成一个整体,不用管这n-1个盘子内部是怎么移动的,因为系统会用递归解决,所以只看这n-1个盘子和最大的盘子如何从A柱移到C柱,这样就变成了两个盘子的移动。

那么这n个盘子与n-1个盘子的移动路线必然经过如下三步:
(1)A柱上n-1个盘子借助C柱移到B柱;

(2)A柱上剩下的那个盘子直接移动到C柱上;

(3)将B柱上n-1个盘子借助A柱移动到C柱上

由此找到递归关系,转换成递归代码如下:

void Hanoi(int n, char x, char y, char z)        //数量、对象,借助媒介,目标
{if (1 == n)move(x, z);else{Hanoi(n - 1, x, z, y);        //表示x柱上n-1个盘子借助z柱移到y柱上move(x, z);           //打印x->z的移动路线Hanoi(n - 1, y, x, z);      //表示y柱上n-1个盘子借助x柱移到z柱上}
}

运行效果:

完整代码如下:

#include<stdio.h>
#include<stdlib.h>void move(char a, char b)
{printf("%c->%c\n", a, b);
}void Hanoi(int n, char x, char y, char z)      //数量、对象,介质,目标
{if (1 == n)move(x, z);else{Hanoi(n - 1, x, z, y);        //表示x柱上n-1个盘子移到y柱上借助z柱move(x, z);           //打印x->z的移动路线Hanoi(n - 1, y, x, z);      //表示y柱上n-1个盘子移到z柱上借助x柱}
}int main()
{int n;printf("please input the number of plates:\n");scanf("%d", &n);printf("The movement route of plate:\n");Hanoi(n, 'A', 'B', 'C');system("pause");
}

总结:
在用递归思想解决问题时,不要细想每一步是怎么解决的,而是思考n与n-1甚至n-2的递归关系。虽然对简化代码的复杂程度,但是问题规模确是2n,这点需要注意。

15. 【C语言】Hanoi塔问题(Demo)相关推荐

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

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

  2. Rosetta Stone (罗赛塔石碑) for Mac 美式英语1-5级语言包下载

    Rosetta Stone (罗赛塔石碑) for Mac 美式英语1-5级语言包下载 软件截图: 转载于:https://www.cnblogs.com/Morus-alba/p/10626462. ...

  3. hanoi塔(汉诺塔)--C语言

    hanoi塔(汉诺塔)–C语言 一.什么是hanoi塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄 ...

  4. n阶Hanoi塔问题(动图分析)-C语言

    n阶Hanoi塔问题 Hanoi塔问题规则 Hanoi塔分析 参考程序 Hanoi塔问题规则 每次只能移动一个圆盘: 圆盘可以插在X.Y和Z中的任一塔座上: 任何时刻都不能将一个较大的圆盘压在较小的圆 ...

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

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

  6. [编程神域 C语言浮游塔 第①期] Hello C language world

    建议新人收藏使用! 前言 个人介绍: 大家好,欢迎来到C语言浮游塔,这里是设计人茅场晶彦(误)专栏作者渡枫,人称枫子哥. 初衷: 因为自己很多软件相关的朋友在大一初学C语言的就直呼"难上了天 ...

  7. 关于Hanoi塔的实现

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

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

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

  9. [编程神域 C语言浮游塔 第②期] 程序框架的搭建及14种基本运算符

    前言 都不知道有没有人在看.(悲) 经过之前的学习,我们知道了C语言的起源,C语言的基本结构以及一些基础知识. 本期我们会在此基础上向大家讲解14种运算符(主流使用).格式以及字符的输入输出.数据类型 ...

  10. Hanoi塔问题分析

    简介 关于Hanoi塔问题的分析,在网上的文章都写烂了.之所以打算写这篇文章,更多的是针对这个问题相关的各种数学思路和代码实现过程做一个总结.它虽然是一个看似简单的问题,后面引申出来的问题推导方法和思 ...

最新文章

  1. 用prototype 方式来创建客户端组件类
  2. Unable to open debugger port (127.0.0.1:4184): java.net.SocketException socket closed
  3. MVC4项目中验证用户登录一个特性就搞定
  4. c语言按F1键运行,C语言的编译和运行按什么键
  5. antd From 中 Form.Item里含有自己封装的组件,获取不到值的解决方法
  6. java 动态添加定时器_quartz实现任务动态增加和删除
  7. 为Windows2008升级系统补丁
  8. Hdu2660 Accepted Necklace【简单dfs】
  9. 二年级四则运算扩展,可以指定题目数量,并可支持真分数运算
  10. Flask第十八篇 Flask-Migrate
  11. 大数据分析流程步骤都有哪些
  12. 经典网页设计:25个精美的全屏背景网站设计作品
  13. 灰色预测模型_python
  14. TPM-TPM-Profile-PTP协议-2
  15. 为什么说图像的低频是轮廓,高频是噪声和细节
  16. 基于JAVA线上动漫周边商城计算机毕业设计源码+数据库+lw文档+系统+部署
  17. [BZOJ4084][Sdoi2015]bigyration hash
  18. Python实现 天天向上的力量(嵩天老师)
  19. 泡泡玛特再曝“兑奖纠纷”,昔日“盲盒第一股”面临三重难题
  20. 大数据工程师工作笔记之集群节点准备

热门文章

  1. WAV 文件格式分析
  2. 我使用过的Linux命令之usleep - 延迟以微秒为单位的时间
  3. android remoteviews view,Android 理解RemoteViews
  4. HC-05蓝牙模块AT指令设置教程
  5. 把Swing的Icon转换到SWT的Image
  6. 30岁转行程序员晚了吗?分享30岁转行的经历
  7. 软考嵌入式系统设计师2011年上午试题总结
  8. Revit建模插件:REVIT MEP 管道拐弯坡度画法及管道弯头半径显示
  9. vue中enter回车键事件
  10. Protractor版本大事记