Ваш вопрос разрушил мою производительность!
Я просто потратил свое драгоценное время, пытаясь ответить на него, и вот результат:
Сначала вы должны рассчитать место, куда хочет пойти каждый дискот самого большого до самого маленького.Есть 3 простых правила:
- Самый большой диск хочет идти вправо.
- Если диск чуть большего размера перемещается, диск хочет уйти с дороги"(если
N+1
хочет перейти от LEFT
к MIDDLE
, то N
хочет перейти к RIGHT
). - Если диск большего размера не перемещается, диск хочетчтобы перейти в это же место (если
N+1
остается в RIGHT
, N
хочет перейти в RIGHT
).
Затем переместится в нужное место на самый маленький дисккоторый не хочет оставаться на своей привязке .( edit: альтернативно, вы можете переместить первый диск, с которым вы столкнулись, который хочет выполнить законное перемещение, но это подразумевает, что ваш код имеет представление о том, что является допустимым перемещением )
Повторять дорешено.
Пример
Давайте рассмотрим пример Джастина.
Начальная башня
| | |
| | |
| | |
| 1 |
4 2 |
6 5 3
6
хочу перейти от LEFT
RIGHT
(правило 1). 5
хотите перейти от CENTER
до CENTER
(правило 2). 4
хотите перейти от LEFT
до CENTER
(правило 3). 3
хотите перейти от RIGHT
до RIGHT
(правило 2). 2
хотите перейти от CENTER
на RIGHT
(правило 3). 1
хотите перейти с CENTER
на LEFT
(правило 2).
Первым шагом должно быть размещение диска1 на левом колышке (самый маленький диск, который не хочет оставаться на месте).
Next
Следующие шаги будут выглядеть следующим образом:
| | |
| | |
| | |
1 | |
4 2 |
6 5 3
| | |
| | |
| | |
1 | |
4 | 2
6 5 3
| | |
| | |
| | |
| | 1
4 | 2
6 5 3
| | |
| | |
| | |
| | 1
| 4 2
6 5 3
| | |
| | |
| | |
| 1 |
| 4 2
6 5 3
| | |
| | |
| | |
| 1 |
2 4 |
6 5 3
etc.
// TODO : commenting
IРеализованы эти правила, они работают для любой начальной башни (включая обычную все-левую башню).Кроме того, они всегда выбирают кратчайший путь.
YAY!Безрекурсный способ разгадать Ханойскую башню!