Эта игра головоломка была изобретена французским математиком Эдуардом Лукасом в 1883 году. Она продавалась с 8 дисками и с описанием легенды о том, что в храме в Бенаресе, Индия, есть "Башня Брахмы", где жрецы храма перемещают 64 золотых диска по одному диску каждую секунду. Когда они выполнят свою работу, миру придет конец.
Имеется три стержня X, Y и Z. На стержень источник X (source) нанизаны пирамидкой несколько колец разного диаметра. Задача состоит в том, чтобы за наименьшее число ходов перенести пирамиду на целевой стержень Y (target), используя стержень Z (storage), как промежуточный.
За один раз разрешается переносить только одно кольцо, причём, нельзя класть большее кольцо на меньшее.
Рис. 1.
Решить головоломку Ханойская башня можно несколькими методами.
Рекурсивный метод
Предположим, что нам известен алгоритм перемещения n-1 дисков с одного стержня на второй. Дадим функции, реализующей алгоритм этих перемещений имя play. Тогда функция play() для перемещения n дисков со стержня источник на стержень цель должна будет:
- переместить верхние n-1 дисков со стержня источник на промежуточный стержень,
- последний диск n переместить со стержня источник на стержень цель,
- переместить все n-1 диск со стержня промежуточный на стержень цель.
Напишем программу вывода на печать способа перемещения n-го (нижнего) диска, это сделать проще всего.
Лист. 1. Программа перемещения последнего, n-го диска.
В программе, листинг 1, в функции play(), в комментариях, описан весь алгоритм перемещения n дисков со стержня источник на стержень цель. Но, некоторые части функции play() не дописаны. В этих местах вставлены заглушки - функция pass (ничего не делать).
Лист. 2. Вывод программы листинг 1.
Если мы будем решать эту задачу рекурсивно, нам необходимо предусмотреть выход из рекурсии. То есть, мы должны определить границу для рекурсии.
Рекурсия должна закончиться, когда последний диск будет установлен на целевой стержень, а на двух других стержнях не останется дисков. То есть, если n — это количество дисков которые надо переложить, то рекурсия и игра заканчивается, когда n = 0.
Лист. 3. Программа для игры Ханойские башни.
Лист. 4. Вывод программы листинг 3.
Лист. 5. Программа для игры Ханойские башни.
Лист. 6. Вывод программы листинг 5.