Java实现Hanoi(汉诺塔)问题

Hanoi问题简述: 将A上的n个圆盘借助B移到C上,求需要移动的次数or打印移动过程

递归的经典问题,问题详细就不多说了。
求解:问题分解:
(1) 将A上的N-1个盘移动到B上
(2) 将B上的N-1个盘再移动到C上
以上即显示了递归思想:将父问题分解为2个子问题
Hanoi(1) = 1
Hanoi(n) = 2*Hanoi(n-1) + 1; 其中1:盘n由A–>C的一次操作

实现

public class Code3_Hanoi {
    public static void main(String[] args) {
        System.out.println(Hanoi(10));
        System.out.println(Hanoi(2));
        HanoiPrint("A", "B", "C", 2);
        System.out.println(Hanoi(3));
        System.out.println("========================");
        HanoiPrint("A", "B", "C", 3);
        System.out.println("========================");
        System.out.println(Hanoi(4));
        HanoiPrint("A", "B", "C", 4);
    }

    public static int Hanoi(int n) {
        if (n == 1) {
            return 1;
        }
        return 2 * Hanoi(n - 1) + 1;

    }

    /* 打印盘移动过程
     * n个盘由A借助B移到C
     */
    public static void HanoiPrint(String A, String B, String C, int n) {
        if (n == 1) {
            System.out.println(n + " : " + A + " --> " + C);
        } else {
            HanoiPrint(A, C, B, n - 1);    // A上的n-1个盘借C移到B
            System.out.println(n + " : " + A + " --> " + C);    // A现在为空
            HanoiPrint(B, A, C, n - 1);                   // B上的n-1个盘借A移到C
        }
    }
}

输出

1023
3
1 : A --> B
2 : A --> C
1 : B --> C
7
========================
1 : A --> C
2 : A --> B
1 : C --> B
3 : A --> C
1 : B --> A
2 : B --> C
1 : A --> C
========================
15
1 : A --> B
2 : A --> C
1 : B --> C
3 : A --> B
1 : C --> A
2 : C --> B
1 : A --> B
4 : A --> C
1 : B --> C
2 : B --> A
1 : C --> A
3 : B --> C
1 : A --> B
2 : A --> C
1 : B --> C

你可能感兴趣的:(Java)