• 轻松学会汉诺塔


    目录

    规则

    移动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. }

  • 相关阅读:
    关于vue中image控件,onload事件里,event.target 为null的奇怪问题探讨
    ChaosBlade Java 场景性能优化,那些你不知道的事
    ENVI为遥感影像设置空间坐标系的方法
    vue插槽(slot)详解
    区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(三)
    python读取yaml文件内容
    先导小型五轴联动数控加工中心
    《熟悉List集合》第一弹
    C# 委托学习1
    锅总浅析Prometheus 设计
  • 原文地址:https://blog.csdn.net/qq_62712350/article/details/126087417