O caso clássico do algoritmo de divisão e conquista Java: Torre de Hanói

algoritmo dividir e conquistar

Pensamento

Quando resolvemos alguns problemas, porque esses problemas precisam lidar com muitos dados, ou o processo de solução é bastante complicado, o método de solução direta leva muito tempo ou não pode ser resolvido diretamente. Para esse tipo de problema, geralmente o decompomos em vários subproblemas primeiro, encontramos as soluções para esses subproblemas e, em seguida, encontramos um método adequado para combiná-los em uma solução para o problema inteiro. Se esses subproblemas forem muito grandes para serem resolvidos, eles podem ser divididos em vários subproblemas menores e assim por diante, até que a solução possa ser encontrada diretamente. Essa é a ideia básica da estratégia de dividir e conquistar.

Divida e conquiste etapas de resolução de problemas

(1) Decomposição, divida o problema a ser resolvido em vários problemas semelhantes de menor escala;
(2) Resolva, quando os subproblemas são divididos em pequenos o suficiente, use um método mais simples para resolver;
(3) Mescle, de acordo com o requisitos do problema original, As soluções para os subproblemas são combinadas camada por camada para formar a solução para o problema original.

Algoritmo clássico de dividir e conquistar - Torre de Hanói

Torre de Hanoi: A Torre de Hanoi (também conhecida como Torre de Hanoi) é um brinquedo educativo que se originou de uma antiga lenda na Índia. Quando Brahma criou o mundo, ele fez três pilares de diamante.Em um pilar, 64 discos de ouro foram empilhados em ordem de tamanho de baixo para cima. Brahma ordenou que Brahmin reorganizasse os discos em outro pilar em ordem de tamanho a partir de baixo. E é estipulado que o disco não pode ser ampliado no disco pequeno, e apenas um disco pode ser movido entre os três pilares por vez.

Implementação Java da Torre de Hanói
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 da operação
第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

Acho que você gosta

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