As seguintes definições foram adotadas nesta solução:
1) as torres foram nomeadas de 'A' (origem), 'B' (destino) e 'X' (apoio);
2) os discos empilhados na torre de origem são identificados numericamente mantendo a relação
com os seus tamanhos, ficando sempre empilhados em ordem decrescente em uma determinada
torre: do maior na base ao menor no topo da pilha;
Exemplo para 3 discos:
| | |
1 | |
2 | |
__3__ __|__ __|__
Torre A Torre X Torre B
Conforme as regras desse problema, discos maiores não podem sobrepor discos menores em uma
determinada torre, sendo que a movimentação deles é livre entre as torres, desde de que
seja um disco por vez.
Para resolver o problema, a pilha de discos na torre de origem deve ser movida para a torre
de destino, usando uma torre extra para apoio à movimentação.
Um algoritmo aplicando recursividade facilita a solução, pois devemos mover uma possível
pilha de discos que esteja sobre um disco maior em uma determinada torre antes de poder
mover esse disco maior para outra torre:
função recursiva( disco, origem, destino, apoio ){
se ( disco > 1 )
{
// mover antes para a torre de apoio uma possível pilha sobre um disco
// que necessita ser movido para a torre de destino:
recursiva( disco - 1, origem, apoio, destino );
}
// agora podemos mover o disco para a torre de destino após a pilha sobre ele
// ter sido movida para a torre de apoio:
escreva( "mover disco ", disco, " da torre ", origem, " para torre ", destino );
se ( disco > 1 )
{
// mover a pilha de discos que está na torre de apoio para a de destino,
// ficando esta sobre o disco que foi movido antes:
recursiva( disco - 1, apoio, destino, origem );
}
}
função principal(){
recursiva( 3, 'A', 'B', 'X');
}
Após a execução do algoritmo acima, a disposição dos discos nas torres será:
| | |
| | 1
| | 2
__|__ __|__ __3__
Torre A Torre X Torre B
A seguir temos o programa escrito na linguagem C:
#include <stdio.h>
int passo, qtd;
void function( int disco, char origem, char destino, char apoio ){
if ( disco < 1 ) return;
if ( disco > 1 ) function( disco - 1, origem, apoio, destino );
printf( "\nPasso %d: mover disco %d de %c para %c", ++passo, disco, origem, destino );
if ( disco > 1 ) function( disco - 1, apoio, destino, origem );
}
int main(void) {
passo = 0;
qtd = 3;
function( qtd, 'A', 'B', 'X' );
return 0;
}
Saída produzida pelo programa acima:
Passo 1: mover disco 1 de A para B
Passo 2: mover disco 2 de A para X
Passo 3: mover disco 1 de B para X
Passo 4: mover disco 3 de A para B
Passo 5: mover disco 1 de X para A
Passo 6: mover disco 2 de X para B
Passo 7: mover disco 1 de A para B
Para testar o programa acima, utilize a plataforma ideone.com:
https://ideone.com/qtypyY
Bom estudo e até a próxima.