Если вы не знаете, что такое Ханойская башня , я кратко объясню: есть три стержня и несколько дисков, каждый из которых имеет свой размер. В начале все диски находятся на первой башне в отсортированном порядке: самый большой внизу, самый маленький сверху. Цель состоит в том, чтобы перенести все диски на третий стержень. Звучит легко? В этом и заключается подвох: вы не можете поместить диск поверх диска, который меньше другого диска; вы можете держать только один диск в руке за раз, чтобы переместить их на другой стержень, и вы можете поместить диск только на стержни, а не на стол, подлый ублюдок.
Пример решения 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"
[( "А", "В"), ( "А", "С"), ( "В", "С")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Выход
Правда, если условия, которые можно найти под «вызовом», держатся.
Ложь, если они этого не делают.
Тестовые случаи:
Правда:
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"
Ложь:
3-й предложен @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
и т.д.)?