Torre de hanoi

Estou resolvendo uma apostila e me deparei com o seguinte exercicio…

Exercício de Linguagem de programação

Torre de Hanói

A torre de Hanói é um quebra-cabeça que consiste em uma base contendo três pinos, em um dos quais são dispostos alguns discos uns sobre os outros, em ordem crescente de diâmetro, de cima para baixo.

O problema consiste em passar todos os discos de um pino para outro qualquer,usando um dos pinos como auxiliar, de maneira que um disco maior nunca fique em cima de outro menor em nenhuma situação. O número de discos pode variar sendo que o mais simples contém apenas três.

A torre de Hanói tem sido tradicionalmente considerada como um procedimento para avaliação de capacidade de memória de trabalho, e principalmente de planejamento e solução de problemas.

A torre de Hanói possui várias formas de resolução. Uma delas é a resolução recursiva a qual podemos dizer que é a mais limitada quanto ao tempo de realização, já que sua execução dependerá de alguns fatores para se tornar-se mais eficaz.

A resolução Iterativa utiliza alguns ciclos (estruturas) de repetição (for, whiles) que podem ser chamado de laços, existe ainda a possibilidade de algumas estruturas adicionais (mais complexas) as quais tornam o algoritmo mais rápido.

Exercício:

Crie uma classe executável em Java que implemente a solução da Torre de Hanói.
O usuário irá digitar a quantidade de discos (3 a 7 discos) e o programa irá imprimir todas as passagens de discos entre os pinos necessárias para a resolução do problema.


Com esse problema eu coloquei mão a massa e fui ver a jogar o jogo torre de hanoi para saber qual a sequencia mais rapida para resolver o problema com cada quantidade de disco

e a resolução foi

3 discos

variaveis: discoA,discoB,discoC,colunaA,colunaB,colunaC;

Os tres discos começam na colunaA:

sequencia:

Movimento1: colunaC <- discoA;
Movimento2: colunaB <- discoB;
Movimento3: colunaB <- discoA;
Movimento4: colunaC <- discoC;
Movimento5: colunaA <- discoA;
Movimento6: colunaC <- discoB;
Movimento7: colunaC <- discoA;

Com 3 discos o mínimo de movimentos possíveis é 7.

4 discos

Variáveis: discoA,discoB,discoC,discoD,colunaA,colunaB,colunaC;

Os quatro discos começam na colunaA:

sequencia:

Movimento1: colunaB <- discoA;
Movimento2: colunaC <- discoB;
Movimento3: colunaC <- discoA;
Movimento4: colunaB <- discoC;
Movimento5: colunaA <- discoA;
Movimento6: colunaB <- discoB;
Movimento7: colunaB <- discoA;
Movimento8: colunaC <- discoD;
Movimento9: colunaC <- discoA;
Movimento10: colunaA <- discoB;
Movimento11: colunaA <- discoA;
Movimento12: colunaC <- discoC;
Movimento13: colunaB <- discoA;
Movimento14: colunaC <- discoB;
Movimento15: colunaC <- discoA;

Com 4 discos o mínimo de movimentos possiveis é 15.


5 discos

Variáveis: discoA,discoB,discoC,discoD,discoE,colunaA,colunaB,colunaC;

Os cinco discos começam na colunaA:

sequencia:

Movimento1: colunaC <- discoA;
Movimento2: colunaB <- discoB;
Movimento3: colunaB <- discoA;
Movimento4: colunaC <- discoC;
Movimento5: colunaA <- discoA;
Movimento6: colunaC <- discoB;
Movimento7: colunaC <- discoA;
Movimento8: colunaB <- discoA;
Movimento9: colunaB <- discoB;
Movimento10: colunaA <- discoA;
Movimento11: colunaA <- discoC;
Movimento12: colunaB <- discoA;
Movimento13: colunaC <- discoB;
Movimento14: colunaB <- discoA;
Movimento15: colunaB <- discoA;
Movimento16: colunaC <- discoB;
Movimento17: colunaA <- discoA;
Movimento18: colunaC <- discoC;
Movimento19: colunaC <- discoA;
Movimento20: colunaA <- discoB;
Movimento21: colunaB <- discoA;
Movimento22: colunaA <- discoA;
Movimento23: colunaA <- discoB;
Movimento24: colunaC <- discoA;
Movimento25: colunaC <- discoC;
Movimento26: colunaB <- discoA;
Movimento27: colunaB <- discoB;
Movimento28: colunaC <- discoA;
Movimento29: colunaA <- discoA;
Movimento30: colunaC <- discoB;
Movimento31: colunaC <- discoA;

Com 5 discos o mínimo de movimentos possiveis é 31.


6 discos

Variáveis: discoA,discoB,discoC,discoD,discoE,discoF,colunaA,colunaB,colunaC;

Os seis discos começam na colunaA:

sequencia:

Movimento1: colunaB RECEBE discoA;
Movimento2: colunaC RECEBE discoB;
Movimento3: colunaC RECEBE discoA;
Movimento4: colunaB RECEBE discoC;
Movimento5: colunaA RECEBE discoA;
Movimento6: colunaB RECEBE discoB;
Movimento7: colunaB RECEBE discoA;
Movimento8: colunaC RECEBE discoD;
Movimento9: colunaC RECEBE discoA;
Movimento10: colunaA RECEBE discoB;
Movimento11: colunaA RECEBE discoA;
Movimento12: colunaC RECEBE discoC;
Movimento13: colunaB RECEBE discoA;
Movimento14: colunaC RECEBE discoB;
Movimento15: colunaC RECEBE discoA;
Movimento16: colunaB RECEBE discoE;
Movimento17: colunaA RECEBE discoA;
Movimento18: colunaB RECEBE discoB;
Movimento19: colunaB RECEBE discoA;
Movimento20: colunaA RECEBE discoC;
Movimento21: colunaC RECEBE discoA;
Movimento22: colunaA RECEBE discoB;
Movimento23: colunaA RECEBE discoA;
Movimento24: colunaB RECEBE discoD;
Movimento25: colunaB RECEBE discoA;
Movimento26: colunaC RECEBE discoB;
Movimento27: colunaC RECEBE discoA;
Movimento28: colunaB RECEBE discoC;
Movimento29: colunaA RECEBE discoA;
Movimento30: colunaB RECEBE discoB;
Movimento31: colunaB RECEBE discoA;
Movimento32: colunaC RECEBE discoF;
Movimento33: colunaC RECEBE discoA;
Movimento34: colunaA RECEBE discoB;
Movimento35: colunaA RECEBE discoA;
Movimento36: colunaC RECEBE discoC;
Movimento37: colunaB RECEBE discoA;
Movimento38: colunaC RECEBE discoB;
Movimento39: colunaC RECEBE discoA;
Movimento40: colunaA RECEBE discoD;
Movimento41: colunaA RECEBE discoA;
Movimento42: colunaB RECEBE discoB;
Movimento43: colunaB RECEBE discoA;
Movimento44: colunaA RECEBE discoC;
Movimento45: colunaC RECEBE discoA;
Movimento46: colunaA RECEBE discoB;
Movimento47: colunaA RECEBE discoA;
Movimento48: colunaC RECEBE discoE;
Movimento49: colunaB RECEBE discoA;
Movimento50: colunaC RECEBE discoB;
Movimento51: colunaC RECEBE discoA;
Movimento52: colunaB RECEBE discoC;
Movimento53: colunaA RECEBE discoA;
Movimento54: colunaB RECEBE discoB;
Movimento55: colunaB RECEBE discoA;
Movimento56: colunaC RECEBE discoD;
Movimento57: colunaC RECEBE discoA;
Movimento58: colunaA RECEBE discoB;
Movimento59: colunaA RECEBE discoA;
Movimento60: colunaC RECEBE discoC;
Movimento61: colunaB RECEBE discoA;
Movimento62: colunaC RECEBE discoB;
Movimento63: colunaC RECEBE discoA;

a sequencia mais rapida aqui é com 63 movimentos…

não vou colocar a sequencia com 7 disco que daria 63+63+1=127 movimentos

so que o problema agora é que não consigo como por isto em codigo para uma implementação…fiquei ontem e hoje jogando torre de hanoi
/sei que tem esse exercicio resolvido na net, mas ai eu só estaria copiando.

só quero saber quais classes eu crio aqui e como eu mostro isso de forma organizada para quando a classe ser executada…

Pude perceber tambem que as sequencia que tem a quantidade de disco for igual a impar tem o mesmo padrão para qualquer quantidade cujo o numero de disco for igual a impar…ou seja posso usar a sequencia de 5 disco para a de 7 disco.

Se vc entende de Recursão, é só pegar o básico de Indução Fraca e levar isso à risca que vc consegue. Vc quer aprender, isso já é um começo.

static void move(char origem, char destino, char auxiliar, int nDiscos)

Essa é a declaração do método, ou seja, o que vc precisa pra fazer o negócio acontecer. Com isso, vc já pode começar a pensar.

Qualquer dúvida, vai postando aqui.