Lembra do jogo das torres de Hanoi que mencionei na primeira aula? Espero que você tenha jogado um pouco pois agora vamos ver como juntar todos os fundamentos do pensamento computacional para resolver esse problema.

As regras do jogo

O tabuleiro do jogo é composto por três postes e um conjunto de discos de tamanhos diferentes. Os discos começam empilhados do maior para o menor no primeiro poste e o objetivo é mover a pilha para o terceiro poste. As regras são simples:

  1. somente um disco pode ser movido por vez;
  2. um disco maior não pode ser colocado sobre um disco menor.

Posição inicial.

Posição inicial.

Posição final.

Posição final.

Decomposição

Vamos analisar o problema mais simples, quando a pilha tem somente um disco. A solução é trivial, basta mover o disco da coluna da esquerda para a coluna da direita.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4b3f14ae-4fd1-4c49-b272-6d4d0fdb5eed/0.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f1125dfe-2182-4517-b954-2d228bda1b47/1.png


Passamos para o problema com dois discos.

Primeiro é preciso liberar o disco maior para ele poder se movimentar usando o poste intermediário para guardar o disco menor.

Então, movemos o disco maior para a posição final.

Por fim, movemos o disco menor para terminar a solução. Fácil, mas ainda não ajuda muito a resolver os problemas com muitos discos.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bd14456c-b810-4ece-8cdc-5925d703210b/00.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/014a436e-9f8d-47b6-ad8b-7d49c7a983fe/01.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a31c26e2-03ad-4aee-ae4b-b529a2a37c21/10.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1faf96be-2af7-4e33-886e-0bc1e27cd870/11.png


No problema com três discos a coisa começa a ficar realmente interessante, acompanhe.

Podemos pensar nos dois discos menores como um disco "composto". Dessa forma o problema se reduz para o caso com 2 discos.

O que queremos é mover a pilha superior para o poste intermediário para liberar o disco maior. Perceba que nós já sabemos como mover uma pilha de dois discos.

Movemos o disco maior para a sua posição final.

Por fim, terminar de mover a pilha.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/817db2b2-2612-4dc2-9abb-99494bf87726/000.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/90db3fe2-fdc0-4c67-960a-2fdb30ee9df5/011.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b49029c2-6863-418f-a382-2add9338c10a/100.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b5e41fee-e432-426f-b071-7502dbfac2c3/111.png

Como fica o problema com 4 discos? Seguimos a mesma estratégia.

Movemos a subpilha para o poste intermediário para liberar o disco maior.

Movemos o disco maior para a posição final.

Finalizamos movendo a subpilha para a posição final. Perceba que sabemos mover uma pilha de três discos para uma determinada posição.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9cbea04d-e430-48d2-8083-9fb54416ba06/0000.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8107fc63-0506-4cd3-937a-55e3a75c74fa/0111.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/16006364-9794-45ea-a982-58b7843fcd2f/1000.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/748c8c83-8ebd-4fa7-b08a-b825fe82b0bf/1111.png

Abstração

Vamos construir uma representação simplificada do problema para tentar reconhecer algum padrão que nos permita construir um algoritmo para resolver o problema. Vou nomear os postes com as letras A, B e C e vou numerar os discos na sequência do menor para o maior.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0d3b723f-d592-46aa-b873-02cb936fb2ad/000_anotado.png


Assim, para resolver o problema com três discos, precisamos seguir a seguinte sequência de movimentos: 0 → 1 → 0 → 2 → 0 → 1 → 0. Podemos observar um determinado padrão emergindo: sempre movimentamos o disco 0 seguido de outro disco. Vamos observar isso melhor.

Posição inicial →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/dcec3af9-d5c0-444c-b0cf-a793115685e1/000.png

0 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/27d89e75-9ab8-433d-8d61-dbfff7268447/001.png

1 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/43fd5462-6445-45b1-9dcf-04b6f65ee386/010.png

0 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f8e21e92-760f-4b5e-a061-167d69992440/011.png

2 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9cb360be-7d2c-45fc-934a-a9155834726c/100.png

0 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cd0b38e8-3bb5-4a2c-9df0-5c7ffa9f8414/101.png

1 →

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/612ce44d-030f-480b-8d2c-6f30a327705c/110.png

0 → Fim

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3ee091b7-3542-4cc8-8da8-9bb67e7713de/111.png

Pare um pouco e veja como aparentemente surge uma estrutura do tipo: 0 → 1 → 020 → 1 → 0. Sem demonstração vou afirmar que a solução do problema de 4 discos deve ser algo do tipo:

0 → 1 → 0 → 2 → 0 → 1 → 030 → 1 → 0 → 2 → 0 → 1 → 0. Pare e teste no jogo.