码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 轻松学会汉诺塔


    目录

    规则

    移动1个圆盘:

    移动俩个圆盘

    移动三个圆盘 

    用拆分(递归)的思想移动三个圆盘

    用拆分(递归)的思想移动四个圆盘 

    代码实现汉诺塔


    规则

    简答介绍下规则,有三个柱子,在一根柱子上从下往上按从大到小的顺序摆着n个盘子。现在让我们把第一根柱子上的圆盘按从大到小的顺序摆放到另一个柱子上,并且在小圆盘上不能放上大圆盘,三根柱子之间一次只能移动一个圆盘。

    移动1个圆盘:

    我们只需把A移动到C即可

    移动俩个圆盘

     先把A移动到B

    再把A移动到C 最后再把B移动到C即可

    移动三个圆盘 

     把A移动到C,A移动到B,C移动到B:

    再把A移动到C,B移动到A,B移动到C,A移动到C即可。 

     我们发现,如果想让把一个柱子上的所有圆盘移到另一个柱子上,就要把最后一个圆盘上面的圆盘移动到它们之间的柱子上。(很重要)

    根据这个逻辑我们再来实现三个圆盘的移动

    用拆分(递归)的思想移动三个圆盘

     

    我们现在需要把上面俩个圆盘移动到B

    把该圆盘拆成:

     现在问题变成,把A上的圆盘通过中转位置C移动到B上。

    我们可以通过中转柱子C做到。

    把A移动到C

    A移动到B,

    再把C移动到B:

    再合起来 

     现在就可以把A移动到C了。

     现在问题就变成,把B通过中转位置A移动到C了。

    把B移动到A

    B移动到C

     A移动到C

    问题就迎刃而解了。

    用拆分(递归)的思想移动四个圆盘 

    想要把A移动到C上,我们需要把A最上面的3个圆盘 ,移动到B上。

    可以把它拆分为:

    要把A上面的圆盘移动到B上,我们需要把A最上面的俩个盘子移动到C上。

    可以拆分为:

    我们要把A上面的圆盘移动到C上,就需要把最上面的一个圆盘移动到B上。

    A移动到B

    A移动到C

     B移动到C

    合起来看

     

     现在就可以把A移动到B

    然后把C上的圆盘通过A移动到B

    C移动到B

    C移动到B

    A移动到B

    合起来看

    现在就可以把A移动到C了

    到这一步,我需要把B移动到C,就需要把上面的俩个圆盘移动到A

    继续拆

     要把B移动到A就需要,把B最上面的一个圆盘移动到C

    再把B移动到A

    C移动到A

     合起来看

    现在就可以把B移动到C了

    A移动到B

    A移动到C

    B移动到C

    好啦,大功告成啦!

    代码实现汉诺塔

    首先写一个move函数,它可以描述我们的移动路径

    1. public static void move(char pos1,char pos2){
    2. System.out.print(pos1+"-->"+pos2+" ");
    3. }

    接下来就是实现hanio函数啦

    1. public static void hanio(char pos1,char pos2,char pos3,int n) {
    2. //pos1是初始位置,pos2是中转位置,pos3为目标位置。
    3. if(n==1){
    4. move(pos1,pos3);
    5. return;
    6. }else{
    7. hanio(pos1,pos3,pos2,n-1);
    8. move(pos1,pos3);
    9. hanio(pos2,pos1,pos3,n-1);
    10. }
    11. }

    检验成果啦!

    1. public static void hanio(char pos1,char pos2,char pos3,int n) {
    2. if(n==1){
    3. move(pos1,pos3);
    4. return;
    5. }else{
    6. hanio(pos1,pos3,pos2,n-1);
    7. move(pos1,pos3);
    8. hanio(pos2,pos1,pos3,n-1);
    9. }
    10. }
    11. public static void main(String[] args) {
    12. hanio('A','B','C',4);
    13. }

  • 相关阅读:
    【机械臂、无人机规控篇】(9)机械臂轨迹规划、跟踪控制方向
    1.jetson与摄像头的对接
    C++ 因项目需求,需要将0~2的32次方这个区间的数字保存到内存当中(内存大小为4G),并且可以实现对任意一个数字的增删。(先叙述设计思路,再写岀代码)
    springboot+redis发布/订阅
    C#获取CPU/主板/硬盘/电脑名称
    应用层-HTTP协议
    【HarmonyOS NEXT】鸿蒙 代码混淆
    web前端期末大作业——餐品后台管理系统(html+css+javascript)
    新版HBuilderX在uni_modules创建搜索search组件
    pumping lemma
  • 原文地址:https://blog.csdn.net/qq_62712350/article/details/126087417
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号