java数据结构和算法学习之汉诺塔示例


下面是一个简单的Java示例,展示了如何实现汉诺塔(Tower of Hanoi)问题。汉诺塔问题是一个经典的递归问题,涉及将一堆大小不同、穿在一根针上的盘子移动到另一根针上,同时遵守以下规则:

1. 每次只能移动一个盘子。

2. 任何时候,较大的盘子都不能放在较小的盘子上面。

通常有三根针:A、B和C。开始时,所有盘子都堆叠在针A上,目标是将所有盘子移动到针C上,针B可以作为辅助工具。


public class HanoiTower {
    
    /**
     * 解决汉诺塔问题的方法
     * @param n 盘子的数量
     * @param from 起始针
     * @param aux 辅助针
     * @param to 目标针
     */
    public static void hanoi(int n, char from, char aux, char to) {
        if (n == 1) {
            // 只有一个盘子时,直接移动到目标针
            System.out.println("Move disk 1 from " + from + " to " + to);
            return;
        }
        // 将上面的n-1个盘子通过目标针移动到辅助针
        hanoi(n - 1, from, to, aux);
        // 将最大的盘子从起始针移动到目标针
        System.out.println("Move disk " + n + " from " + from + " to " + to);
        // 将n-1个盘子从辅助针移动到目标针
        hanoi(n - 1, aux, from, to);
    }

    public static void main(String[] args) {
        int n = 3; // 假设有3个盘子
        hanoi(n, 'A', 'B', 'C'); // 从A针移动到C针,B针作为辅助
    }
}

这段代码首先定义了一个`hanoi`方法,它递归地解决汉诺塔问题。在`main`方法中,我们调用`hanoi`方法,并传入盘子数量(例如3)和三根针(A、B、C)的标识。程序将输出移动盘子的步骤。