【C语言】图文解析,深入浅出汉诺塔问题

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 【C语言】图文解析,深入浅出汉诺塔问题

什么是汉诺塔?

汉诺塔(Tower of Hanoi)源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,并且在移动时三根柱子之间一次只能移动一个圆盘。

C语言实现汉诺塔

具体解决汉诺塔问题思路分析

从上面的对于汉诺塔问题的说明我们可以得到这样一个结论


如果要把A柱上的盘子全部都移动到C柱上,要遵循以下规则:


1.每次只能移动A柱最上面的一个盘子

2.小盘子上不能放大盘子。


我们来一步一步分析,首先设此时A中有n个盘子,我们现在的目标是借助B柱把A上的盘子全部移动到C柱上


当需要A上需要移动的盘子n=2时

这个很简单我就不画图啦!

我们只需要先把A最上面的盘子移到B上,再把A另一个盘子移到C上,最后把B上盘子移到C上即可。

当需要A上需要移动的盘子n=3时

614f3129a392403aba1d1a10a184952e.png


将2个盘子从A移动到B上。重复n=2时的步骤,此时是将那2个盘子从A借助C移动到B

2f1949e5d6ea447da1cf6e636fae4414.png


接着,把A上的盘子移动到C上

fa0e6501fa4b45f08fe95c0cada1c0d9.png

将B上的2个盘子移动到C上。重复n=2时的步骤,此时是将那2个盘子从B借助A移动到C

122ea7af6c4e4322889f3dc7d34972b6.png

当需要A上需要移动的盘子n=4时

e82bb2deceb4420aa148dad780b14099.png


将3个盘子从A移动到B上。重复n=3时的步骤,与n=3不同之处在于,我们此时是借助C把A上盘子移到B

62414e1dae724922b94d6aed369eed67.png


将A上最后一个盘子移动到C上

0087c9e250af47f695be571445f38a14.png


将B上的3个盘子移动到C上。重复n=3时的步骤,与n=3不同之处在于,我们此时是借助A把B上盘子移到C

1b6aeff3c120435eacdaf71b458fa93e.png


当需要A上需要移动的盘子为n时

怎么样,经过上面的讲解你发现规律了吗?

也就是说,对于任意一个大于1的正整数n,如果有一个n层汉诺塔的问题,我们就可以将之分解为两个n-1层汉诺塔问题求解

实现汉诺塔问题的代码

通过我们上面的分析,我们就可以把这个问题看成这三步:


1.将A上n-1层的盘子通过C移动到B上

2.将此时A上剩余的盘子移动到C上

3.将B上此时n-1层的盘子通过A移动到C上


参考代码如下:

#include<stdio.h>
void Move (char A, char C, int n)
{
  printf("把第%d个盘子从%c--->%c\n", n, A, C);
}
void HanoiTower(char A, char B, char C, int n)
{
  if (n == 1)
  {
    Move(A, C, n);
  }
  else
  {
    //将n-1个盘子从A柱借助于C柱移动到B柱上
    HanoiTower(A, C, B, n - 1);
    //将A柱最后一个盘子移动到C柱上
    Move(A, C, n);
    //将n-1个盘子从B柱借助于A柱移动到C柱上
    HanoiTower(B, A, C, n - 1);
  }
}
int main()
{
  int n = 0;
  printf("输入A柱子上的盘子个数:");
  scanf("%d", &n);
  //将n个盘子从A柱借助于B柱移动到C柱上
  HanoiTower('A', 'B', 'C', n);
  return 0;
}


3ccaad70878c4a70a6f31865d966228a.png

总结

今天的内容暂时到这里就结束了,我们今天通过递归的方式具体解决了汉诺塔问题。如果你还有问题的话一定要自己试一下,不然光看是非常容易遗忘并且非常不容易理解的,咱们必须反复的练习才能熟悉起来!

好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!


**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**


20fa3306e76244de9879742c165c792a.gif

目录
相关文章
|
1天前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
1月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
2月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
31 1
|
2月前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
24 0
|
2月前
|
自然语言处理 C语言 C++
程序与技术分享:C++写一个简单的解析器(分析C语言)
程序与技术分享:C++写一个简单的解析器(分析C语言)
|
2月前
|
C语言
【c语言】汉诺塔问题详解(c语言递归函数)
【c语言】汉诺塔问题详解(c语言递归函数)
14 0
|
3月前
|
存储 搜索推荐 编译器
C语言数组深入解析与实战应用
C语言数组深入解析与实战应用
34 0
|
3月前
|
C语言
C语言if语句深度解析
C语言if语句深度解析
|
3月前
|
存储 C语言 索引
C语言字符数组深入解析与应用实例
C语言字符数组深入解析与应用实例
36 0
|
3月前
|
C语言
C语言函数嵌套与递归调用的深入解析
C语言函数嵌套与递归调用的深入解析
36 0

推荐镜像

更多