| 
| 
 | Вопрос # 1 358/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Пожалуйста помогите!!!Мне нужна программа "Ханойские башни" Программа должна быть рекурсивной. Не могли бы вы помочь кто чем может?
 
|  |   Вопрос задал: Тоха (статус: Посетитель)Вопрос отправлен: 20 февраля 2008, 17:13
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Тоха!"Ханойская башня" построена на очень простом алгоритме. Здесь я привожу этот алгоритм, который Вы сможете без труда воспроизвести.
 
 type
THanoiBin = 0..2;
THanoiLevel = 0..9;
……………… 
procedure MoveDisc(FromPin, ToPin : THanoiPin; Level : THanoiLevel);
//  Это Вы должны сделать сами. Переместите один диск с одного штырька на другой.
//  Диск окажется наверху (естественно, выше него дисков не будет)Вы можете каким угодно образом перемещать диски 3-х пирамид. 3 пирамиды - наиболее простая разновидность алгоритма. Таким образом процедура переноса диска (MoveDisc) аналогична операции переноса диска на верхний уровень (MoveTopDisc): переместить диск наверх с одного штырька (FromPin) на другой штырек (ToPin) и передать указатель на штырек-приемник (MoveTower) вместе с уровнем расположения перемещенного диска. Другое решение заключается в использовании трех массивов [THanoiLevel] логического типа. В этом случае триггер "Истина (True)" означает наличие на пирамиде диска с размером, соответствующим порядковому номеру элемента массива THanoiLevel. 
 procedure MoveTower(FromPin, ToPin : THanoiPin; Level : THanoiLevel);
begin
if HanoiLevel <= High(THanoiLevel) then
begin
   MoveTower(FromPin, 3 - FromPin - ToPin, Level + 1);
   MoveDisc(FromPin, ToPin, Level);
   MoveTower(3 - FromPin - ToPin, ToPin, Level + 1);
end;
end;Чтобы переместить пирамиду целиком, вы должны вызвать процедуру MoveTower следующим образом: 
 MoveTower(0, 1, Low(THanoiLevel)); Вот как бы и все. Написание полного кода оставляю за вами.
 Желаю удачи.
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 20 февраля 2008, 18:10
 Оценка за ответ: 4
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |