题目内容:

汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>0)穿孔圆盘,盘的尺寸由下到上依次变小,盘的数字编号由上到下依次递增(Disk1为最顶部的圆盘)。要求按下列规则将所有圆盘移至C杆:

1. 每次只能移动一个圆盘;

2. 大盘不能叠在小盘上面;

3. 可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

输入圆盘数N,给出移动步骤。

输入样例:

1

输出样例:

Step1: Move Disk1 from A to C

输入样例:

2

输出样例:

Step1: Move Disk1 from A to B

Step2: Move Disk2 from A to C

Step3: Move Disk1 from B to C

输入样例:

3

输出样例:

Step1: Move Disk1 from A to C

Step2: Move Disk2 from A to B

Step3: Move Disk1 from C to B

Step4: Move Disk3 from A to C

Step5: Move Disk1 from B to A

Step6: Move Disk2 from B to C

Step7: Move Disk1 from A to C

解析:

汉诺塔问题设计到  “递归算法”

刘汝佳的《算法竞赛入门》上,是这样写的

递归:
如果你没有明白什么是递归,参见“递归”

不过这是一个死循环,而递归是有“出口”的(即有结束条件的)

再有一个例子,这里有五个箱子,分别是

金箱子

银箱子

铜箱子

铁箱子

木箱子

要打开这五个箱子,你必须有对应的五把钥匙,而你现在只拥有 木箱子的钥匙

BUT

金箱子 的钥匙在 银箱子 里

银箱子 的钥匙在 铜箱子 里

铜箱子 的钥匙在 铁箱子 里

铁箱子 的钥匙在 木箱子 里

所以你只得先打开 木箱子,取出 铁钥匙

再打开 铁箱子,取出 铜钥匙

再打开 铜箱子,取出 银钥匙

再打开 银箱子,取出 金钥匙

最后才能打开 金箱子

这其实就是一个递归的思想

回到汉诺塔问题。

我们要把 N 个圆盘在遵守条件的情况下

A柱 移动到 B柱

首先,我们要 N-1个 圆盘移动到 B柱

然后把 第N个 圆盘移动到 C柱

然后把 那N-1个 圆盘再移动到 C柱

为了将 这N-1个 圆盘移动到C柱

我们又得将 这一轮循环中 的  N-1(即N-2)个 圆盘先移动到A柱

再把 这一轮循环中的第N个 (即第N-1个)圆盘移动到C柱

然后再把 这一轮循环中 的 N-1(即N-2)个 圆盘移动到C柱

为了……

直到达成目的。

所以我们要使用一个封装函数来做三个步骤:

1.将 N-1个 圆盘从A柱移动到B柱

2.将 第N个 圆盘从A柱移动到C柱

3.将 刚才那N-1个 圆盘从B柱移动到C柱

代码如下:
#include<stdio.h>void Hannuota(int N,char a,char b,char c);int i = 0;                                   //定义全局变量i记录步数 int main(void)
{int N;scanf("%d",&N);Hannuota(N,'A','B','C');return 0;
}void Hannuota(int N,char a,char b,char c)  //a 代表 起始柱;b 代表中间柱; c 代表目的柱
{                                                         if(N==1){             i++;                         //只有一层的时候就从直接把它从A柱移动到C柱 printf("Step%d: Move Disk%d from %c to %c\n",i,N,a,c);}else{Hannuota(N-1,a,c,b);                   //不止一层的话,先把N-1个从A柱移动到B柱 i++;printf("Step%d: Move Disk%d from %c to %c\n",i,N,a,c);  //把第N个移动到C柱 Hannuota(N-1,b,a,c);                   //再把这N-1个从B柱移动到C柱 }
}

C语言练习题之汉诺塔(MOOC)相关推荐

  1. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  2. c语言递归解决汉诺塔问题

    c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.

  3. 【项目展示】自己用C语言编写的汉诺塔小游戏

    本文目录 1.前言 2.什么是汉诺塔? 3.项目规格 4.基本思路 5.源代码 6.运行结果 7.感想与心得 8.未来规划 1.前言 昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知 ...

  4. 汉诺塔c语言源程序步骤,汉诺塔问题的算法分析及C语言演示程序的实现

    摘要:该文对经典的"汉诺塔"问题进行了详细的分析,并用C语言实现.通过问题的具体实现,使学习者了解问题的全过程,推广到一般. 关键词:汉诺塔;递归;C语言 中图分类号:TP301. ...

  5. C语言入门递归算法——汉诺塔(简单易懂,最后还有汉诺塔游戏)

    什么是汉诺塔: 汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始 ...

  6. c语言中的汉诺塔问题详解

    汉诺塔问题是一个古典的数学问题,也是c语言学习中一个用递归方法解题的典型实例,我们先看一下原题. 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A ...

  7. c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”

    说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...

  8. C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

    汉诺塔问题是我们在学习函数递归时常遇见的一类问题,那么如何用简单易懂的思路来解决汉诺塔问题呢?下面我会为大家进行讲解 目录 汉诺塔是什么? 汉诺塔的来源 用C语言实现汉诺塔 汉诺塔问题分析思路: 用代 ...

  9. C语言-数字炸弹汉诺塔

    1.数字炸弹 制作简单的猜数字游戏,程序运行时自动产生1~100的随机数字,接着等待键盘输入猜的数字,若输入的数字不对,那么现在猜数字的范围就缩小,直至猜对为止. (1).随机数的产生 C语言提供sr ...

最新文章

  1. linux定时任务定向到空,Linux 定时任务下 /dev/null 21 相关知识说明
  2. 详解Java中的复合视图设计模式
  3. 轻量级NLP工具Trankit开源,中文处理更精准,超越斯坦福Stanza,内存占用小45%
  4. 文本分类的目的和分类的方法
  5. C# Marshal类基本概念和入门示例程序
  6. JavaWEB中读取配置信息
  7. UIView 的基础
  8. Maven添加Oracle驱动及依赖
  9. php 规则配置,模块Config配置规则
  10. asp.net下的“Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。”错误的一个可能的成因...
  11. 操作系统--进程管理1--单个CPU情况
  12. 狼的故事9:共同的利益
  13. 嵌入式 tomcat的使用
  14. 二元线性回归最小二乘法公式推导
  15. 域名购买之后怎么使用
  16. RGB色彩模式-最广的颜色系统之一
  17. android之银行卡手机号码自动补齐空格
  18. 固定资产管理系统的作用何在?
  19. 为什么要学习排序算法?
  20. 70道android面试题汇总

热门文章

  1. RIM微软效仿苹果 将提供免费MobileMe同类服务
  2. 老人机轮询紧急拨号功能
  3. java dataset读取数据,TensorFlow读写数据
  4. Android模拟点击事件
  5. ACMICPC 2014 Shanghai Onsite 总结
  6. 《计算之魂》Task2:怎样寻找最好的算法
  7. 投影仪怎么连接电脑?快来看看这3种方法!
  8. 2020年终总结-我在美国度过的一年
  9. elementui 表格中单元格自定义功能
  10. 知名新能源充电桩企业采购我司标签视觉识别系统