Explicação detalhada do problema da Torre de Hanói
Introdução e histórico do problema
Torre de Hanói, também conhecida como Torre de Hanói. É um brinquedo educativo originário de antigas lendas indianas. Quando Brahma criou o mundo, ele fez três pilares de diamante. Em um pilar, havia 64 discos de ouro empilhados em ordem de tamanho. Brahma ordenou que Brahmin reorganizasse os discos em outro pilar em ordem de tamanho, de baixo para cima. Também está 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.
A seguir, analisaremos as ideias específicas do problema da Torre de Hanói!
Ilustração da Torre de Hanói em movimento
n=3
Pode-se entender aqui que primeiro colocamos o anteriorn-1Os dois discos são movidos para o pilar B com a ajuda do pilar C, depois o disco maior é movido para o pilar C e então a mesma ideia é executada.
n=4
quandon=4, ainda podemos primeiro colocar o anteriorn-1um disco (aqui, ou seja,três primeiros discos) tente colocá-lo no pilar B (a operação específica será explicada mais tarde) e, em seguida, coloque o disco maior no pilar C. Depois de fazer isso,Trate o disco maior como fixoe recebi a soman=3Uma situação semelhante é mostrada na figura acima. As transferências subsequentes são fáceisn=3mesmo.
Análise de problemas e implementação de código
Primeiro método de movimentação de disco n-1
Premissa: Existem n discos dispostos no pilar A, do menor para o maior. Existem três pilares. Marcamos esses três pilares como A, B e C, respectivamente.
1.Quando n for um número par, mova o menor disco na ordem A->B->C->A, mova uma vez;Quando n for um número ímpar, mova o menor disco na ordem A->C->B->A, mova uma vez;
2. Em seguida, mova os discos móveis dos outros dois pilares para o novo pilar.Ou seja, mova o disco do pilar não vazio para o pilar vazio. Quando ambos os pilares não estiverem vazios, mova o disco menor., mova uma vez. Embora esta etapa não especifique claramente qual disco mover, a ação executada é única.
3. Repita as operações 1 e 2 e finalmente complete o movimento da Torre de Hanói.
Número de movimentos
Ordem | Número de movimentos | lei |
---|---|---|
1 | 1 | 2^1-1 |
2 | 3 | 2^2–1 |
3 | 7 | 2^3-1 |
4 | 15 | 2^4-1 |
… | … | … |
n | \ | 2^n-1 |
Se nos mudarmos antesn-1De acordo com a Hanoi(n-1)
conclusão acima, o número de movimentos de n discos pode ser Hanoi(n)=2*Hanoi(n-1)-1
calculado usando (n>0).
Código fonte
int Hanoi(int n)
{
if (n > 0)
return 2 * Hanoi(n - 1);
else
return 1;
}
int main()
{
int n = 0;
printf("圆盘的个数:>");
scanf("%d", &n);
int ret = Hanoi(n) - 1;
printf("%d\n", ret);
return 0;
}
Impressão em etapas móveis
Para imprimir as etapas móveis no código, devemos entender todo o processo. Na verdade, há um loop no movimento da Torre de Hanói:Quando n é um número par, ele sempre faz um loop com A->B, A->C, B->C, A->B, C->A, C->B; quando n é um número ímpar, ele sempre loops com A ->C,A->B,C->B,A->C,B->A,B->C loop.
A implementação específica do código é a seguinte
#include<stdio.h>
#include<windows.h>
int count;
void Move(int n, char a, char b)
{
count++;
Sleep(1000);
printf("第%2d次移动 Move %d: %c -> %c \n", count, n, a, b);
}
void Hanoi(int n, char a, char b, char c)
{
if (n == 1)
{
Move(n, a, c);
}
else
{
Hanoi(n - 1, a, c, b);
Move(n, a, c);
Hanoi(n - 1, b, a, c);
}
}
int main()
{
int n = 0;
printf("汉诺塔的层数:>");
scanf(" %d", &n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}