Jeśli nie wiesz, czym jest Wieża Hanoi , wyjaśnię to krótko: Istnieją trzy pręty i niektóre dyski, z których każda ma inny rozmiar. Na początku wszystkie dyski znajdują się w pierwszej wieży w uporządkowanej kolejności: największa jest na dole, a najmniejsza na górze. Celem jest przeniesienie wszystkich dysków na trzeci pręt. Brzmi łatwo? Oto haczyk: Nie można umieścić płyty na płycie, która jest mniejsza niż druga płyta; możesz jednocześnie trzymać tylko jeden dysk w dłoni, aby przenieść go na inny pręt i możesz umieścić dysk tylko na prętach, a nie na stole, podstępny draniu.
przykładowe rozwiązanie ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Wyzwanie
Istnieją trzy pręty zwane A, B i C. (Można to również nazywać odpowiednio 1,2 i 3, jeśli to pomaga) Na początku wszystkie n tarcz są na pręcie A (1).
Twoim wyzwaniem jest zweryfikowanie rozwiązania dla wieży hanoi. Musisz upewnić się, że:
- Na koniec wszystkie n tarcz znajduje się na pręcie C (3).
- Dla dowolnego dysku w dowolnym stanie nie ma pod nim mniejszego dysku.
- Żadnych oczywistych błędów, takich jak próba przeniesienia dysków z pustego pręta lub przesunięcia dysków do nieistniejących prętów.
(rozwiązanie nie musi być optymalne).
Wkład
Twój program otrzyma dwa dane wejściowe:
- Liczba dysków n (liczba całkowita)
Wykonane ruchy, które będą składały się z zestawu krotek: (wieża, z której zabiera się obecnie najwyższy dysk), (wieża, aby zabrać ten dysk), gdzie każda krotka odnosi się do ruchu. Możesz wybrać sposób ich reprezentacji. Na przykład coś takiego jak następujące sposoby przedstawienia rozwiązania dla n = 2, które narysowałem powyżej w ascii. (Wykorzystam pierwszy z przypadków testowych, ponieważ jest łatwy dla oczu):
„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]
Wydajność
Prawda, jeśli spełnione są warunki, które można znaleźć w „wyzwaniu”.
Falsy, jeśli nie.
Przypadki testowe:
Prawdziwe:
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"
Fałszywe:
Trzeci sugerowany przez @MartinEnder, 7-ty @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"
To jest golf golfowy , wygrywa najkrótsze rozwiązanie. Obowiązują standardowe zasady i luki. Brak baterii w zestawie.
A->A
?
moving discs to nonexistant rods.
więc oczywiście tak, toD
A=1
,B=2
,C=3
, itd.)?