[Linguagem C] análise gráfica, explicação simples do problema da Torre de Hanói

insira a descrição da imagem aqui

Página inicial pessoal de Junxi_

Seja diligente e encoraje os anos a não esperar por ninguém

Desenvolvimento de jogos C/C++


Olá, aqui é Junxi_, hoje vou atualizar um blog que sempre quis atualizar, mas não tenho tempo para escrever - o problema da Torre de Hanoi. Entre todos os problemas relacionados à recursão, o problema da Torre de Hanoi é um dos problemas mais clássicos. Pode-se dizer que se você realmente entender o núcleo do problema da Torre de Hanoi, sua recursão não será tão ruim. Hoje vou mostrar o problema da Torre de Hanoi de uma maneira simples.

O que é a Torre de Hanói?

  • A Torre de Hanói originou-se de um jogo nas antigas lendas indianas. 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 ao se mover.

A linguagem C realiza a Torre de Hanói

Solução específica para a análise do trem de pensamento do problema de Hanói

  • Da descrição acima do problema da Torre de Hanoi, podemos tirar tal conclusão

  • Se você quiser mover todas as placas da coluna A para a coluna C, siga as seguintes regras:

  • 1. Apenas uma placa na parte superior do pilar A pode ser movida por vez

  • 2. A placa não pode ser ampliada na placa pequena.

Vamos analisar passo a passo. Primeiro, suponha que existam n placas em A. Nosso objetivo agora é mover todas as placas de A para a coluna C com a ajuda da coluna B.

Quando n = 2 placas precisam ser movidas em A

  • Isso é tão simples que não vou fazer um desenho!
  • Precisamos apenas mover a placa superior de A para B, depois mover a outra placa de A para C e, finalmente, mover a placa de B para C.

Quando n = 3 placas precisam ser movidas em A

insira a descrição da imagem aqui

  • Mova 2 pratos de A para B. Repita os passos quando n=2, desta vez para mover essas 2 placas de A para B com a ajuda de C

insira a descrição da imagem aqui

  • Em seguida, mova o disco em A para C
    insira a descrição da imagem aqui
  • Mova as 2 placas de B para C. Repita as etapas quando n = 2, desta vez para mover essas 2 placas de B para C com A
    insira a descrição da imagem aqui

Quando n = 4 placas precisam ser movidas em A

insira a descrição da imagem aqui

  • Mova 3 pratos de A para B. Repita os passos quando n=3, a diferença de n=3 é que usamos C para mover a placa de A para B
    insira a descrição da imagem aqui

  • Mova a última placa em A para C
    insira a descrição da imagem aqui

  • Mova as 3 placas de B para C. Repita os passos quando n=3, a diferença de n=3 é que usamos A para mover a placa de B para C
    insira a descrição da imagem aqui

Quando o número de pratos a serem movidos em A é n

  • Que tal, você encontrou o padrão após a explicação acima?
  • Ou seja, para qualquer inteiro positivo n maior que 1, se houver um problema de torre de Hanói de n camadas, podemos decompô-lo em dois problemas de torre de Hanói de n-1 camadas para resolver

Código para implementar o problema da Torre de Hanoi

  • Através de nossa análise acima, podemos considerar este problema como estas três etapas:

  • 1. Mova a placa de camada n-1 em A para B através de C

  • 2. Mova os discos restantes em A para C neste momento

  • 3. Mova a placa na camada n-1 em B para C através de A


  • O código de referência é o seguinte:
#include<stdio.h>

void Move (char A, char C, int n)
{
    
    
	printf("把第%d个盘子从%c--->%c\n", n, A, C);
}

void HanoiTower(char A, char B, char C, int n)
{
    
    
	if (n == 1)
	{
    
    
		Move(A, C, n);
	}
	else
	{
    
    
		//将n-1个盘子从A柱借助于C柱移动到B柱上
		HanoiTower(A, C, B, n - 1);
		//将A柱最后一个盘子移动到C柱上
		Move(A, C, n);
		//将n-1个盘子从B柱借助于A柱移动到C柱上
		HanoiTower(B, A, C, n - 1);
	}
}

int main()
{
    
    
	int n = 0;
	printf("输入A柱子上的盘子个数:");
	scanf("%d", &n);
	//将n个盘子从A柱借助于B柱移动到C柱上
	HanoiTower('A', 'B', 'C', n);
	return 0;
}

insira a descrição da imagem aqui


Resumir

  • Por enquanto, o conteúdo de hoje termina aqui. Resolvemos o problema da Torre de Hanói de forma recursiva hoje. Se você ainda tiver dúvidas, você deve tentar, caso contrário, é muito fácil de esquecer e muito difícil de entender só de olhar, temos que praticar repetidamente para nos familiarizarmos!

  • Bem, se tiverem alguma dúvida, perguntem-me na área de comentários ou mensagem privada, até à próxima!

Não é fácil para um novo blogueiro criar. Se você acha que o conteúdo do artigo é útil para você, clique neste novo blogueiro antes de sair. Seu apoio é minha motivação para atualizar! ! !

**(Ke Li pede para você apoiar o blogueiro três vezes seguidas!!! Clique no comentário abaixo para curtir e coletar para ajudar Ke Li)**

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/syf666250/article/details/131462720
Recomendado
Clasificación