当前位置: 首页 > news >正文

汉诺塔(C++)

解决汉诺塔问题是程序递归思想最基本的体现,问题以及规则如下:

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

                                                                                                                       ——文章取自百度百科

用人话来说就是:

这有A、B、C三根杆子,要把A的所有方块(一般是三块)移到C上,长的不能放在短的上边,求最快步数。

首先,最长的一定要最先到达C底部,到达后就固定不动,在这里我们可以把除了最底下的所有方块看作整体移到中转杆B上,作为第一阶段。

这里我们假设A上是n块,看作整体的为n - 1块。

把n - 1块以A为起始杆,B为目标杆整体移动。

 

代码如下:

move(n - 1, start, end, temp);

然后A只剩下一块,可以直接移到C,第一阶段就算完成。

if (n == 1)
{print(start, end);
}

然后进入第二阶段,现在A上没有方块,不能作为起始杆,所以起始杆为B杆,A看作中转杆

还是一样,把除了最底下的所有方块看作整体移到中转杆A上,作为第二阶段

 

move(n - 1, temp, start, end);

然后B也可以直接放到终点杆固定

还是

if (n == 1)
{print(start, end);
}

 

现在只剩下一个,直接还是

if (n == 1)
{print(start, end);
}

 

全部代码

#include <iostream>using namespace std;int x = 0;void print(char start, char end )
{cout << "第" << ++x << "步:" << start << " -> " << end << endl;
}void move(int n, char start, char temp, char end)
{if (n == 1){print(start, end);}else{move(n - 1, start, end, temp);print(start, end);move(n - 1, temp, start, end);}
}int main()
{int n;cout << "请输入汉诺塔的层数:" << endl;cin >> n;move(n, 'A', 'B', 'C');return 0;
}

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024华数杯数学建模A题完整论文讲解(含每一问python代码+结果+可视化图)
  • 总线学习4--UART
  • pom.xml和.m2的setting的区别?
  • 【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)
  • ES相关介绍与扫盲
  • 【C语言】C语言期末突击/考研--详解一维数组与字符数组
  • 罗杰斯的逆势投资:破而后立
  • 如何选择合适的气膜生产厂家—轻空间
  • 动态规划.
  • (四)软件性能测试
  • Python基于Prophet实现时间序列数据趋势周期特征提取项目实战
  • Vulnhub靶机:JANGOW_ 1.0.1
  • Java面试必看!知己知彼才能百战百胜,如何做好面试前的准备?
  • 光线追踪(纹理映射)
  • c语言-EasyX库编写的第一个项目-哪都通快递平台
  • 「译」Node.js Streams 基础
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 4. 路由到控制器 - Laravel从零开始教程
  • create-react-app做的留言板
  • CSS 三角实现
  • iOS | NSProxy
  • JavaWeb(学习笔记二)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue 动态创建 component
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 解析带emoji和链接的聊天系统消息
  • 理解在java “”i=i++;”所发生的事情
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用agvtool更改app version/build
  • 【干货分享】dos命令大全
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #QT(TCP网络编程-服务端)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #微信小程序:微信小程序常见的配置传旨
  • (分布式缓存)Redis持久化
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ./configure,make,make install的作用
  • .htaccess配置常用技巧
  • .NET Core中的去虚
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET框架
  • .Net小白的大学四年,内含面经
  • .NET运行机制
  • .NET正则基础之——正则委托
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .stream().map与.stream().flatMap的使用
  • /3GB和/USERVA开关
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题