Якщо ви не знаєте, що таке Ханойська вежа , я поясню це коротко: Є три стрижні та кілька дисків, кожен з яких має різний розмір. На початку всі диски знаходяться на першій вежі в упорядкованому порядку: Найбільший - внизу, найменший вгорі. Мета - піднести всі диски до третього стрижня. Звучить легко? Ось привід: ви не можете розмістити диск поверх диска, меншого за інший диск; ви можете тримати лише один диск у руці за один раз, щоб перемістити їх на інший стрижень, і ви можете помістити диск тільки на прути, а не на стіл, підлий ублюдок.
Приклад рішення ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Виклик
Існують три стрижні, що називаються A, B і C. (Ви також можете їх назвати 1,2 і 3 відповідно, якщо це допомагає) На початку всі n диски знаходяться на стрижні A (1).
Ваше завдання - перевірити рішення для башти Ханой. Вам потрібно буде переконатися, що:
- Зрештою всі n диски знаходяться на стрижні C (3).
- Для будь-якого диска в будь-якому даному стані немає меншого диска під ним.
- Ніяких очевидних помилок, як спроба виймати диски з порожнього стрижня або переміщення дисків на неіснуючі стрижні.
(рішення не повинно бути оптимальним.)
Вхідні дані
Ваша програма отримає два входи:
- Кількість дисків n (ціле число)
Зроблені ходи, які будуть складатися з набору кортежів: (башта, щоб взяти з цього самого верхнього диска), (башта, для того, щоб взяти цей диск), де кожен кортеж відноситься до ходу. Ви можете вибрати, як вони представлені. Наприклад, щось на кшталт наступних способів подання рішення для n = 2, які я намалював у ascii вище. (Я буду використовувати перший в тестових випадках, тому що це легко на очах):
"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]
Вихід
Truthy, якщо умови, які можна знайти під "викликом", дотримуються.
Фальсі, якщо вони цього не роблять.
Тестові приклади:
Правда:
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"
Помилковий:
Третій запропонував @MartinEnder, 7-й - @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"
Це кодовий гольф , виграє найкоротше рішення. Застосовуються стандартні правила та лазівки. Батареї не включені.
A->A
?
moving discs to nonexistant rods.
звичайно, так, цеD
A=1
,B=2
,C=3
і т.д.)?