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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 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

目录
相关文章
|
28天前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
106 2
|
20天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
104 14
|
24天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
41 8
|
24天前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
244 6
|
24天前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
34 5
|
24天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
35 5
|
24天前
|
安全 搜索推荐 Unix
【C语言】《回调函数》详细解析
回调函数是指一个通过函数指针调用的函数。它允许将一个函数作为参数传递给另一个函数,并在特定事件发生时执行。这种技术使得编程更加灵活,可以动态决定在何时调用哪个函数。
39 1
|
2月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
4月前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
103 0

推荐镜像

更多