El caso clásico del algoritmo Java divide y vencerás: la Torre de Hanoi

Algoritmo divide y vencerás

Pensamiento

Cuando resolvemos algunos problemas, debido a que estos problemas tienen que lidiar con una gran cantidad de datos, o el proceso de solución es bastante complicado, el método de solución directa lleva mucho tiempo o no se puede resolver directamente en absoluto. Para este tipo de problema, a menudo lo descomponemos primero en varios subproblemas, encontramos las soluciones a estos subproblemas y luego encontramos un método adecuado para combinarlos en una solución al problema completo. Si estos subproblemas aún son demasiado grandes para resolverlos, se pueden dividir en varios subproblemas más pequeños, y así sucesivamente, hasta que se pueda encontrar la solución directamente. Esta es la idea básica de la estrategia divide y vencerás.

Pasos para resolver problemas divide y vencerás

(1) Descomposición, dividiendo el problema a resolver en varios problemas similares de menor escala;
(2) Resolviendo, cuando los subproblemas se dividen en lo suficientemente pequeños, use un método más simple para resolver;
(3) Fusionar, de acuerdo con el requisitos del problema original, las soluciones a los subproblemas se combinan capa por capa para formar la solución al problema original.

Algoritmo clásico de divide y vencerás - Torre de Hanoi

Torre de Hanoi: La Torre de Hanoi (también conocida como la Torre de Hanoi) es un juguete educativo que se originó a partir de una antigua leyenda en la India. Cuando Brahma creó el mundo, hizo tres pilares de diamantes. En un pilar, se apilaron 64 discos de oro en orden de tamaño de abajo hacia arriba. Brahma le ordenó a Brahmin que reorganizara los discos en otro pilar en orden de tamaño desde abajo. Y se estipula que el disco no se puede agrandar en el disco pequeño, y solo se puede mover un disco entre los tres pilares a la vez.

Implementación Java de la Torre de Hanoi
package dac;

public class HanoiTower {
    
    
    public static void main(String[] args) {
    
    
        //分治算法的汉诺塔问题
        hanoiTower(5,'A','B','C');
    }

    /**
     * @param num 一共有多少个盘
     * @param a   a塔
     * @param b   b塔
     * @param c   c塔
     */
    public static void hanoiTower(int num, char a, char b, char c) {
    
    
        //如果只有一个盘,从a移动到c
        if (num == 1) {
    
    
            System.out.println("第1个盘从 " + a + "——>" + c);
        } else {
    
    
            //如果有n>=2个盘,应该看成只有两个盘,将最下面的一个盘和上面的所有盘分开看待。
            //先把最上面的所有盘a——>b,移动过程会使用到c
            hanoiTower(num - 1, a, c, b);
            //把最下面的盘从a——>c
            System.out.println("第" + num + "个盘从 " + a + "——>" + c);
            //把B塔的所有盘从b——>c,移动过程会使用到a塔
            hanoiTower(num-1, b, a, c);
        }
    }
}
resultado de la operación
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第3个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C
第4个盘从 A——>B
第1个盘从 C——>B
第2个盘从 C——>A
第1个盘从 B——>A
第3个盘从 C——>B
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第5个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C
第3个盘从 B——>A
第1个盘从 C——>B
第2个盘从 C——>A
第1个盘从 B——>A
第4个盘从 B——>C
第1个盘从 A——>C
第2个盘从 A——>B
第1个盘从 C——>B
第3个盘从 A——>C
第1个盘从 B——>A
第2个盘从 B——>C
第1个盘从 A——>C

Process finished with exit code 0

Supongo que te gusta

Origin blog.csdn.net/weixin_42643321/article/details/107961309
Recomendado
Clasificación