Коллекция алгоритмов

Ханойские башни
    На доске есть три иглы: 1, 2, 3. На игле 1 размещена башня из n дисков; нижний диск имеет самый большой диаметр, а диаметр каждого следующего меньше предыдущего. За один ход с любой иглы можно взять верхний диск и переместить на другую, но разрешено класть диск лишь на доску или на диск большего диаметра. Нужно переместить всю башню с иглы 1 на иглу 3.
    Эта игра называется "Ханойские башни", поскольку по легенде с n = 64 дисками её начали свыше 1000 лет тому назад монахи в одном монастыре вблизи Ханоя во Вьетнаме; когда они закончат её, наступит конец света. Решением этой игры-задачи является последовательность переносов дисков. Написать программу печати обозначений этих переносов.
    Для переноса башни из n дисков с иглы 1 на иглу 3 необходимо перенести башню из n - 1 дисков на иглу 2, потом перенести нижний диск на иглу 3 и перенести башню с иглы 2 на иглу 3. При переносе башни с 1 на 2 вспомогательной является игла 3, а при переносе с 2 на 3 - игла 1. Другая последовательность действий невозможна. Как видим, решение задачи для башни высотой n описывается через решение задачи для башни высотой n - 1.
    Обозначим disk(a, b) перенос одного диска с иглы a на иглу b, tow(h, a, b, c) - перенос башни высотой h с иглы a на иглу b с использованием иглы c как вспомогательной. При h > 1 выполнение tow(h, a, b, c) сводится к выполнению:
    tow(h - 1, a, c, b); disk(a, b); tow(h - 1, c, b, a).
    А при h = 1 - к выполнению:
    Disk(a,b)
    Итак, имеем программу:
Program Hantow (input, output);
var n: integer;
Procedure disk (f, t: integer);
begin writeln(f, '->', t) end;
Procedure tow (h: integer; f, t, v: integer);
begin
	if h=1 then disk (f, t) else begin
		tow (h-1, f, v, t); disk (f, t); tow (h-1, v, t, f);
	end
end;
begin readln (n); tow (n, 1, 3, 2) end.
			
    Очевидно, что глубина рекурсии этой процедуры равна значению, которое получает первый параметр h.
    Определим количество переходов дисков как функцию f(n), где n - высота башни. Очевидно, что f(1) = 1 и что f(n) = 2 * f(n - 1) + 1. По принципу индукции нетрудно доказать, что f(n) = 2n - 1.

Скачать пример программы на Delphi7

Рейтинг@Mail.ru Rambler's Top100
Сайт управляется системой uCoz