Ханойские башни

Есть три стержня A, B, и C. На стержень A надето N дисков, наверху самый маленький, каждый следующий диск больше предыдущего, а внизу самый большой. На другие стержни дисков не надето. Hеобходимо перенести диски со стержня A на стержень C, пользуясь стержнем B, как вспомогательным, так, чтобы диски на стержне C располагались в том же порядке, в каком они располагаются на диске A перед перемещением.

При перемещении никогда нельзя класть больший диск на меньший.

Рекурсивный метод

Для того, чтобы переложить всю пирамиду, надо сначала переложить все, что выше самого большого диска, с первого на вспомогательный стержень, потом переложить это самое большой диск с первого на третий стержень, а потом переложить оставшуюся пирамиду со второго на третий стержень, пользуясь первым стержнем, как вспомогательным.

/*

данная процедура переносит N дисков со стержня A на стержень C

пользуясь B как вспомогательным, соблюдая правила

*/

процедура "Перенести" (A, B, C, N)

начало

если N=1

// Если диск всего один, то надо его перенести напрямую

то

снять диск со стержня A и положить на стержень C;

возврат из процедуры;

иначе

// Переносим все диски, кроме самого большога со стежня

// A на стержень B

Перенести (A,C,B,N-1);

// Переносим самый большой диск со стержня A на стержень C

снять диск со стержня A и положить на стержень C;

// Переносим все диски со стержня B на стержень C поверх

// самого большого диска

Перенести (B,A,C,N-1);

возврат из процедуры;

конец если;

конец процедуры "Перенести";

procedure Solve(n: integer; a,b,c: Char);

begin

if n > 0 then

begin

Solve(n-1, a, c, b);

Writeln('Переместить диск со стержня ', a, ' на стержень ',b);

Solve(n-1, c, b, a);

end;

end;

begin

Solve(4, '1','2','3');

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: