Uma ilustração detalhada do "Algoritmo da Torre de Hanói"

Olá, olá, sou o pequeno macaco cinza, um programador que pode escrever bugs,

Hoje vou compartilhar com vocês um caso de um algoritmo clássico recursivo --- "Torre de Hanoi".

Revisão da Torre de Hanói

A Torre de Hanói (Torre de Hanói) é derivada de lendas indígenas. Quando o Grande Brahma criou o mundo, ele construiu três pilares de diamante, um dos quais é empilhado com 64 discos de ouro de baixo para cima. O Grande Brahma ordenou ao Brahmin que recolocasse o disco em outro pilar em ordem de tamanho, de baixo para cima. Também é estipulado que o disco não pode ser ampliado no disco pequeno e apenas um disco pode ser movido entre os três pilares de cada vez.

Este é um problema bem conhecido e quase todos os livros didáticos apresentam uma introdução a ele . Porque as condições são :

Com a ajuda de uma coluna de transferência, as placas dispostas na coluna inicial de acordo com as regras são movidas para a coluna final, e apenas uma placa pode ser movida por vez, e a placa grande não pode ser colocada na pequena placa, então o número de movimentos para 64 placas é: 18.446.744.073.709.551.615

Este é um número astronômico. Se fosse possível calcular (e não produzir) um movimento a cada microssegundo, também levaria quase um milhão de anos. Só podemos encontrar uma solução para o problema e resolver a Torre de Hanói quando o valor de N é pequeno, mas é difícil resolver a Torre de Hanói de 64 andares com um computador.

Em exercícios de programação comuns, o problema da Torre de Hanoi também é um caso de algoritmo muito comum. Hoje irei analisar a solução para o problema da Torre de Hanói com meus amigos.

Primeiro, vamos dar uma olhada no diagrama de uma Torre de Hanói de três camadas para ter uma compreensão simples da solução para o problema da Torre de Hanói:

 

Conforme mostrado na figura acima, podemos ver que quando o número de placas é apenas um, podemos mover as placas diretamente para a placa alvo para resolver o problema da Torre de Hanói de três camadas. Primeiro movemos as duas placas superiores para o carrossel do meio com a ajuda da placa alvo, então movemos a placa maior para a placa alvo e, em seguida, movemos a primeira placa do carrossel do meio para a placa inicial, desta vez podemos mover Mover o segundo disco para o disco de destino e, finalmente, mova o primeiro disco do disco inicial para o disco de destino.

A partir disso, podemos resumir a solução da Torre de Hanói com n camadas:

Mova as primeiras n-1 bandejas para a bandeja vazia adjacente com a ajuda da bandeja de transferência atual (não necessariamente a bandeja B), a seguir mova a enésima bandeja para a bandeja de destino e repita as etapas acima até que todas as bandejas sejam movidas para o disco de destino. A ideia recursiva do método da função também é usada aqui.

 

Em seguida, use java e Python para demonstrar o método de solução da Torre de Hanói de ordem n:

Java resolve a Torre de Hanói

package 汉诺塔算法;


public class Hanoi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Hanoi h = new Hanoi();
		char a = 'A';
		char b = 'B';
		char c = 'C';
		int count = h.hanoi(3, a, b, c);
		System.out.println(count);
	}
	
	/**
	 * 汉诺塔问题
	 * @param n 阶数
	 * @param a 起始柱
	 * @param b 中转柱
	 * @param c 目标柱
	 * @return 移动次数
	 * */
	public int hanoi(int n,char a,char b,char c) {
		if (n == 1) {
			move(a, c);
		} else {
			hanoi(n-1, a, c, b);
			move(a, c);
			hanoi(n-1, b, a, c);
		}
		//汉诺塔的移动次数为(2**n)-1
		return (int) Math.pow(2, n)-1;
	}
	
	public void move(char a,char b) {
		System.out.println(a + "--->" + "b");
	}
}

Python resolve a Torre de Hanói

i = 1   # 定义全局变量记录次数
def move(n, a, c):
    global i
    print("第{}步:将编号为{}的盘子从{}--->{}".format(i, n, a, c))
    i += 1
def hanoi(n,a,b,c):
    #a,b,c分别是三根柱子,n为套在a柱上的圆圈个数
    if n == 1:
        move(n, a, c)
    else:
        hanoi(n-1, a, c, b)
        move(n, a, c)
        hanoi(n-1, b, a, c)
if __name__ == '__main__':
    n = int(input("请输入盘子数量:"))
    hanoi(n, "A", "B", "C")

Pois bem, a explicação sobre a Torre de Hanói será compartilhada com os amigos daqui. Se houver deficiências, espero que todos possam me corrigir, e o lobo mau te acompanhará para progredir!

Acho que você gosta

Origin blog.csdn.net/weixin_44985880/article/details/111416152
Recomendado
Clasificación