汉诺塔问题

2017-03-03  本文已影响36人  mcaotuman

汉诺塔问题是法国数学家Edouard Lucas发明的。具体可以描述为有三根木桩,初始的时候有n个盘子,最底层的盘子最大,最上层的盘子最小,按大小顺序依次放在第一根木桩上,然后以第二根木桩作为桥梁,全部搬到第三根木桩。

移动木桩的时候需要注意:
1.每次只能移动一个盘子。
2.大盘子必须放在小盘子下面。

基本算法思想:
1.将n-1个盘子,从木桩1移到木桩2。
2.将第n个盘子,从木桩1移到木桩3。
3.将n-1个盘子,从木桩2移到木桩3。

    /*
     * 将n个盘子由初始木桩移动到目标木桩(利用借用木桩)
     */
    public void hanoi(int n, char from, char denpend_on, char to) {
        if (n == 1)
            // 只有一个盘子是直接将初始木桩上的盘子移动到目的木桩
            move(1, from, to);
        else {
           // 先将初始木桩的前n-1个盘子借助目的木桩移动到借用木桩上
            hanoi(n - 1, from, to, denpend_on);
           // 将剩下的一个盘子移动到目的木桩上
            move(n, from, to); 
           // 最后将借用木桩上的n-1个盘子移动到目的木桩上
            hanoi(n - 1, denpend_on, from, to);
        }
    }

    /*
     * 将编号为n的盘子由from移动到to
     */
    private void move(int n, char from, char to) { 
        System.out.println("Move " + n + " from " + from + " to " + to);
    }

上一篇 下一篇

猜你喜欢

热点阅读