Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

汉诺塔问题

简介

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

image.png

代码

    /**
     * @param num 有多少个圆盘
     */
    public static void hanoiTower(int num) {
        hanoiTower(num, 'A', 'B', 'C');
    }

    /**
     * 圆盘从a塔移动到c塔(b塔作为辅助)
     *
     * @param num 有多少个圆盘
     */
    private static void hanoiTower(int num, char a, char b, char c) {
        if (num == 1) {
            System.out.println(a + "->" + c);
        } else {
            // a->b
            hanoiTower(num - 1, a, c, b);
            // a->c
            System.out.println(a + "->" + c);
            // b->c
            hanoiTower(num - 1, b, a, c);
        }
    }

测试

    public static void main(String[] args) {
        System.out.println("移动步骤如下:");
        hanoiTower(3);
    }

输出如下:

移动步骤如下:
A->C
A->B
C->B
A->C
B->A
B->C
A->C

需要移动的步数为2^n -1n为圆盘的个数)