Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2007, 14:53   #1
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
Восклицание Помогите с "Ханойскими башнями"

Дорогие мои!!! Мне надо курсовую сдавать..... а у меня ничего нет!!! Программка вот такая:

Есть три стержня A, B, и C. На стержень A надето N дисков, наверху самый маленький, каждый следующий диск больше предыдущего, а внизу самый большой. На другие стержни дисков не надето.
Hеобходимо перенести диски со стержня A на стержень C, пользуясь стержнем B, как вспомогательным, так, чтобы диски на стержне C располагались в том же порядке, в каком они располагаются на диске A перед перемещением. При перемещении никогда нельзя класть больший диск на меньший.
Все это надо сделать на Delphi с формой, чтобы пользователь мог сам переносить диски.... ПОЖАЛУЙСТА ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 05.05.2007, 17:21   #2
Shuraken
Форумчанин
 
Аватар для Shuraken
 
Регистрация: 16.04.2007
Сообщений: 298
По умолчанию

В инете есть замечательный файл помощи drkb.chm. Скачай его, там много интересного, а на твой вопрос:

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



type
THanoiPin = 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));


Взято с www.delphiworld.narod.ru
Не надо ничего усложнять. Все достаточно тривиально.
Shuraken вне форума Ответить с цитированием
Старый 05.05.2007, 19:03   #3
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

Это я уже видела!!!! Спасибо тебе, конечно, ОГРОМНОЕ!!! Но просто сейчас реально времени нет..... Может у кого-нибудь есть уже готовая программка?? Если есть я буду ОЧЕНЬ благодарна!!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 05.05.2007, 23:51   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Код:
const N=10;

procedure Hanoy(A,B,C:char; count:integer);
begin
   if count>0 then
   begin
      Hanoy(A,C,B,count-1);
      Writeln('From '+A+' to '+C);
      Hanoy(B,A,C,count-1);
   end
end;

begin
  Hanoy('A','B','C',N)
end.

Последний раз редактировалось Stilet; 17.02.2010 в 08:28.
Carbon вне форума Ответить с цитированием
Старый 06.05.2007, 10:55   #5
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

Понимаешь, мне на Дельфи надо!!!!!!!!!!! На Паскале-то я уже сделала!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 07.05.2007, 16:54   #6
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Так в чем проблема? Портировать с Паскаля на Делфи? Скинь наработки, раз есть...
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 08.05.2007, 00:28   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Берём объект ListBox1, кидаем на форму, берём кнопку Button1, кидаем на форму, пишем:

const N=10;

procedure Hanoy(A,B,C:char; count:integer);
begin
if count>0 then
begin
Hanoy(A,C,B,count-1);
Form1.ListBox1.Items.Add('From '+A+' to '+C);
Hanoy(B,A,C,count-1);
end
end;

2 раза щёлкаем по кнопке. В появившейся процедуре пишем:


Hanoy('A','B','C',N)
Carbon вне форума Ответить с цитированием
Старый 13.05.2007, 13:25   #8
Solny6ko YasnoE
Пользователь
 
Регистрация: 05.05.2007
Сообщений: 31
По умолчанию

Люди!!!! Вот вроде с игрой у меня все получилось, теперь мне бы на Дельфи написать демо-версию этой игры, т.е. чтобы она показывала сама все ходы - передвигала эти самые блоки!!! Буду очень благодарна!!!!!!!!!!!!!
Solny6ko YasnoE вне форума Ответить с цитированием
Старый 14.05.2007, 08:13   #9
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

В каждом цикле (а точнее в одном) делаем прорисовку параметров и паузу.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 12.01.2008, 22:34   #10
kolduev
Пользователь
 
Регистрация: 12.01.2008
Сообщений: 30
По умолчанию

с алгоритмом понятно, но как это всё привязать к компонентам, мож я чё не понимаю... из чего тогда делать колышки и диски?
kolduev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49
На чем пишутся стратегии типа "Казаков" и "Эпохи империи" Tayfun Свободное общение 3 26.06.2007 20:27