Hanoi汉诺塔问题(java)

之前就听说过Hanoi这个问题,然后就觉得这个实践起来好难操作,反正我这个手笨的人肯定是没戏了....。刷题遇到了,只能研究一下怎么回事了。OK,参考了Hanoi思想和别人家的代码,终于写完,其实代码很少,就是思想很关键吧。



1、牛客网题目:

对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。

给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。

测试样例:
1
返回:move from left to right


2、分析:已ac

参考:http://blog.csdn.net/qq_27848507/article/details/65442015?locationNum=9&fps=1

2.1、思想:

当只有一个盘子的时候,只需要将A塔上的一个盘子移到C塔上。

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

    综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。 


    Hanoi汉诺塔问题(java)_第1张图片

最少移动次数:pow(2, n) - 1


2.2、code

package schooloffer;

import java.util.ArrayList;

/**
 * Created by caoxiaohong on 17/10/25.
 * 对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘
 * 都移到右边的柱子上,请实现一个函数打印最优移动轨迹。
 */
public class Hanoi {
    ArrayList res=new ArrayList();
    public ArrayList getSolution(int n) {
        // write code here
        helper(n,"left","right","mid");
        return res;
    }

    /**
     * 递归算法
     * @param n 共计有n个盘子
     * @param from n个盘子开始所在的位置
     * @param to   n个盘子最终要被移动到的位置
     * @param midddle 中间移动过程中,需要借助的位置
     */
    private void helper(int n,String from,String to,String midddle){
        if(n==1){
            res.add("move "+"from "+from+" to "+to);//res.add("move 1"+" from "+from+" to "+to);显示是第几个盘子被移动
        }else{
            helper(n-1,from,midddle,to);
            res.add("move "+"from "+from+" to "+to);//res.add("move "+n+" from "+from+" to "+to);显示是第几个盘子被移动
            helper(n-1,midddle,to,from);
        }
    }

    public static void main(String[] args) {
        Hanoi t=new Hanoi();
        t.getSolution(2);
    }
}




你可能感兴趣的:(算法,nowcoder笔记)