汉诺塔问题(思路及实现)

 什么是汉诺塔?

递归思路:

当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将x塔上的1号盘子(编号从上到下)移动到y塔上,再将x塔上的2号盘子移动的z塔上,最后将y塔上的小盘子移动到z塔上。
当x塔上有3个盘子时,先将x塔上编号1至2的盘子(共2个)移动到y塔上(需借助z塔),然后将x塔上的3号最大的盘子移动到z塔,最后将y塔上的两个盘子借助x塔移动到z塔上。
当x塔上有n个盘子是,先将x塔上编号1至n-1的盘子(共n-1个)移动到y塔上(借助z塔),然后将x塔上最大的n号盘子移动到z塔上,最后将y塔上的n-1个盘子借助x塔移动到z塔上。

如图, 首先说一下将x上的三个盘子放到z上该怎么实现?

第一步,将第一个x上的圆盘移到z,   x — > z

第二步,将第二个x上的圆盘移到y,   x—>y

第三步,将z上的圆盘移到y, z—>y

第四步,将x上的圆盘移到z, x—>z

第五步,将y上的第一个圆盘移到x,  y—>x

第六步,将y上的盘子移到z,   y—>z

第七步,将x上的盘子移到z,     x—>z

         到这里就完成了简单的三个盘子的移动。这里把一个盘子看成一个整体,也可以把两个盘子看成一个整体来做,思路都是一样的。

下面是先将x上的前两个盘子看成 一个整体进行移动之后拆开再单独移动。其实也一样,最后还要将前两个拆开单独进行移动。

     图一:基本思路

前两个x—>y        //hanno(n-1,begin,end,mid);
                               x     z   y
    前一个x—>z
    第二个x—>y
    前一个z—>y
第三个x—>z
前两个y—>z     //  hanno(n-1,mid,begin,end);
    前一个y—>x                y    x    z
    第二个y—>z
    前一个x—>z

           

  图二:程序代码

class Hanno{
    public static void main(String[] args){
        //盘子的个数 出发 中间 目的
        hanno(3,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+" -> "+end);    //begin不一定是X,end不一定是Z,是变化的
        }else{
            hanno(n-1,begin,end,mid);   //前n-1个从出发到中间,就比如将前两个盘子整体从x——>y
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);   //前n-1个从中间到目的,就比如将前两个盘子整体从y——>z
        }
    }
}

就比如三个盘子:hanno(n-1,begin,end,mid);  意思是:将前两个盘子从x移到y,借助z.此时begin为x,end为z,mid为y。同理,hanno(n-1,mid,begin,end);将前两个盘子从y移到z借助x

执行结果:

     

再对比一下图一

是不是恍然大悟了。

发布了11 篇原创文章 · 获赞 1 · 访问量 373

猜你喜欢

转载自blog.csdn.net/qq_45824565/article/details/104285971