Se você não sabe o que é a Torre de Hanói , explicarei brevemente: Existem três barras e alguns discos, cada um com um tamanho diferente. No começo, todos os discos estão na primeira torre, em ordem ordenada: o maior está na parte inferior, o menor no topo. O objetivo é levar todos os discos para a terceira barra. Parece fácil? Aqui está o problema: você não pode colocar um disco em cima de um disco menor que o outro disco; você só pode segurar um disco em sua mão de cada vez para movê-lo para outra haste e só pode colocar o disco em hastes, e não em cima da mesa, seu bastardo sorrateiro.
solução de exemplo ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Desafio
Existem três hastes chamadas A, B e C. (Você também pode chamá-las respectivamente 1,2 e 3, se isso ajudar). No início, todos os n discos estão na haste A (1).
Seu desafio é verificar uma solução para a torre de Hanói. Você precisará garantir que:
- No final, todos os n discos estão na haste C (3).
- Para qualquer disco em um dado estado, não há disco menor abaixo dele.
- Não há erros óbvios, como tentar tirar discos de uma barra vazia ou mover discos para barras inexistentes.
(a solução não precisa ser ótima.)
Entrada
Seu programa receberá duas entradas:
- O número de discos n (um número inteiro)
Os movimentos realizados, que consistem em um conjunto de tuplas de: (torre para tirar o disco atualmente mais alto), (torre para levar esse disco) onde cada tupla se refere a um movimento. Você pode escolher como eles são representados. Por exemplo, algo como as seguintes maneiras de representar a solução para n = 2, que eu desenhei nas ascii acima. (Usarei o primeiro nos casos de teste, porque é fácil para os olhos):
"A-> B; A-> C; B-> C"
[("A", "B"), ("A", "C"), ("B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Saída
Na verdade, se as condições que podem ser encontradas em "desafio" se mantiverem.
Falsy, se não o fizerem.
Casos de teste:
Verdade:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
Falso:
3º sugerido por @MartinEnder, 7º por @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
Este é o código-golfe , a solução mais curta vence. Aplicam-se regras e brechas padrão. Sem pilhas incluídas.
A->A
?
moving discs to nonexistant rods.
então é claro que sim, é umD
A=1
,B=2
,C=3
, etc.)?