Структура данных и алгоритмы - Ханойская башня
Башня Ханоя - это математическая головоломка, которая состоит из трех башен (колышков) и более одного кольца, как показано на рисунке -
Эти кольца имеют разные размеры и расположены в порядке возрастания, то есть меньшее находится над большим. Есть и другие варианты головоломки, в которых количество дисков увеличивается, но количество башен остается прежним.
Правила
Миссия - переместить все диски в какую-то другую башню, не нарушая порядок расположения. Несколько правил, которым необходимо следовать для Ханойской башни:
- Между башнями в любой момент времени можно перемещать только один диск.
- Снимать можно только «верхний» диск.
- Никакой большой диск не может поместиться поверх маленького.
Ниже приведено анимированное изображение решения загадки Ханойской башни с тремя дисками.
Загадку Ханойской башни с n дисками можно решить за минимум 2n−1шаги. Эта презентация показывает, что головоломка с 3 дисками заняла23 - 1 = 7 шаги.
Алгоритм
Чтобы написать алгоритм для Ханойской башни, сначала нам нужно узнать, как решить эту проблему с меньшим количеством дисков, скажем → 1 или 2. Мы помечаем три башни именем, source, destination а также aux(только для помощи при перемещении дисков). Если у нас есть только один диск, то его можно легко переместить с источника на привязку назначения.
Если у нас 2 диска -
- Сначала мы перемещаем меньший (верхний) диск на вспомогательную привязку.
- Затем мы перемещаем больший (нижний) диск на целевой колышек.
- И, наконец, мы перемещаем меньший диск с вспомогательной на целевую привязку.
Итак, теперь мы можем разработать алгоритм для Ханойской башни с более чем двумя дисками. Разделим стопку дисков на две части. Самый большой диск (n- й диск) находится в одной части, а все остальные (n-1) диски - во второй части.
Наша конечная цель - переместить диск nот источника к месту назначения, а затем поместите на него все остальные (n1) диски. Мы можем представить, как применить то же самое рекурсивным образом для всего заданного набора дисков.
Следующие шаги -
Step 1 − Move n-1 disks from source
to aux
Step 2 − Move nth disk from source
to dest
Step 3 − Move n-1 disks from aux
to dest
Рекурсивный алгоритм для Ханойской башни можно запустить следующим образом:
START
Procedure Hanoi(disk, source, dest, aux)
IF disk == 1, THEN
move disk from source to dest
ELSE
Hanoi(disk - 1, source, aux, dest) // Step 1
move disk from source to dest // Step 2
Hanoi(disk - 1, aux, dest, source) // Step 3
END IF
END Procedure
STOP
Чтобы проверить реализацию в программировании на C, щелкните здесь .