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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2008, 22:32   #1
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию Рекурсивное решение задачи о Ханойских Башнях

Всемиизвестную задачу о Ханойских башнях нам предлагают решить рекурсивно при помощи стеков.
Я написал процедуру перемещения колец, и как по мне, так она обязана работать идеально, но
если кольцо всего одно, процедура работает (слава Богу, что хоть где то правильно), а когда делаю отладку при двух кольцах, то на строчке №29 происходит то, чего я не прошу - диск с третьей башни переходит на вторую.
Может я чего то не понимаю, объясните пожалуйсто.

На всякий случай дам алгоритм рекурсивного решения задачи о Ханойских башнях:

Если m=1, то перенеси один диск с s1 на s2. Если же m> 1, то перенеси временно m - 1 верхних дисков с s1 на s3. Потом перенеси один оставшийся диск с s1 на s2 и, наконец, перенеси m - 1 дисков, хранящихся на s3, на шпиль s2. Что касается перенесения m-1 дисков, то для этого подойдет тот же алгоритм, но с уменьшенным (от m до m-1) числом переносимых дисков. Таким образом, мы перейдем от m к m-1, oт m-1 к m-2, m-3,... и дойдем до единицы

А так же саму задачу
В центре мира в вершинах равностороннего треугольника в землю вбиты три алмазных шпиля. На одном из них надето 64 золотых диска убывающих радиусов (самый большой – нижний). Трудолюбивые буддийские монахи день и ночь переносят диски с одного шпиля на другой. При этом, диски следует переносить по одному и нельзя класть больший диск на меньший . Когда все диски перенесут на другой шпиль, наступит конец света (задачу и рассказ придумал математик Эдуар Люка в 1883 г.).

Код:
Код:
type stack = array [1..10] of integer ;
var s1,s2,s3:stack; {это и есть башни}
    m,i,n: integer;
    t1,t2,t3:integer; {указатели, на сколько заполнен стек}
procedure pop ( var s:stack;var t:integer);{извлечение}
 begin
  n:=s[t];         {взять в руки верхний диск}
  s[t]:=0;         {теперь то место, где был верхний диск, стало пустым}
  t:=t-1;          {сделать верхним диском пред. диск}
 end;
procedure push (var s:stack; var t: integer);  {добавление}
 begin
  t:=t+1;          {верхним диском стал след. диск}
  s[t]:=n;         {положили на верх то, что было у нас в руках}
 end;
procedure mov (var m:integer;var s1,s2,s3:stack);   {переместить все диски с 1 на 2}
 begin
  if m=1 then      {если диск всего один}
   begin
    pop (s1,t1);   {сниммем с исходного штыря диск}
    push (s2,t2);  {повесим на конечный}
   end;
  if t1 > 1 then   {если дисков больше одного}
   begin
    pop (s1,t1);   {снять диск с исходного}
    push (s3,t3);  {положить его на промежуточный}
    m:=t1;
    mov (m,s1,s3,s2); {повторить все то же, считая промежуточный диск конечным и наоборот}
   { pop (s1,t1);   {переместить оставшийся один}
   { push (s2,t2);  {диск с начального диска на конечный}
    m:=t3;
    mov (m,s3,s1,s2); {сделать все то же самое, считая начальный вспомогателным и наоборот}
   end;
end;

BEGIN
  write ('Введите число дисков ');
  read(m);
  t1:=0;
  t2:=0;
  t3:=0;
  n:=0;
  for i:=1 to m do    {заполняем стеки}
   begin
    n:=n+1;
    push (s1,t1);
   end;
  mov (n,s1,s2,s3);
END.
Буду признателен за помощь, а то препод не считает правильным мне помагать
bullvinkle вне форума Ответить с цитированием
Старый 31.03.2008, 22:38   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

http://www.programmersforum.ru/showthread.php?t=14318
_Dmitry вне форума Ответить с цитированием
Старый 01.04.2008, 13:09   #3
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Спасибо, но мне бы хотелось разобраться со своей процедурой.
При ее написании придерживался именно того алгоритма, что ты мне дал.


И я до сих пор не понимаю проблемы. Мне подсказали, что процедуру MOV следовало бы переименовать - теперь она зовется Cange , но мне от этого не легче
bullvinkle вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи на решение Pascal abc Tecka Фриланс 9 18.12.2012 22:20
Решение задачи на c++ JOFRIF Помощь студентам 2 21.04.2008 00:35
Решение задачи на Си kisha Общие вопросы C/C++ 9 19.11.2007 23:31
решение задачи TuNeR Microsoft Office Excel 2 15.10.2007 09:31