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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2011, 15:40   #1
DoubleTrouble
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 32
По умолчанию Надо поправить код.(Волновой алгоритм, Pascal)

Задача:
Цитата:
Витя хочет придумать новую игру с числами. В этой игре от игроков требуется преобразовывать четырехзначные числа не содержащие нулей при помощи следующего разрешенного набора действий:

1. Можно увеличить первую цифру числа на 1, если она не равна 9.

2. Можно уменьшить последнюю цифру на 1, если она не равна 1.

3. Можно циклически сдвинуть все цифры на одну вправо.

4. Можно циклически сдвинуть все цифры на одну влево.

Например, применяя эти правила к числу 1234 можно получить числа 2234, 1233, 4123 и 2341 соответственно. Точные правила игры Витя пока не придумал, но пока его интересует вопрос, как получить из одного числа другое за минимальное количество операций.

Формат входного файла


Во входном файле содержится два различных четырехзначных числа, каждое из которых не содержит нулей.

Формат выходного файла

Программа должна вывести последовательность четырехзначных чисел, не содержащих нулей. Последовательность должна начинаться первым из данных чисел и заканчиваться вторым из данных чисел, каждое последующее число в последовательности должно быть получено из предыдущего числа применением одного из правил. Количество чисел в последовательности должно быть минимально возможным.
Вот то что я написал:

l-очередь,p- массив индексов предшественников,n-начало,m-искомое. Берёт половину тестов. На второй половине какая то ошибка выполнения. Пробовал по шагам делать но так оооочень долго и поэтому не знаю в какой строчке точно вылетает. Знаю только что именно в цикле этом а не на выводе последовательности в файл.
Код:
l[1]:=n;
  head:=1;
  tail:=2;
  while head<tail do
    begin
      if l[head]<9000 then //первое дейтсвие
        begin
          l[tail]:=l[head]+1000;
          p[tail]:=head;
          inc(tail);
          if l[tail-1]=m then break; // выходим если достигли искомое число
        end;
      if l[head] mod 10<>1 then //второе действие
        begin
          l[tail]:=l[head]-1;
          p[tail]:=head;
          inc(tail);
          if l[tail-1]=m then break;
        end;
        tmp:=l[head]; //выделение цифр для сдвига
      chislo[1]:=tmp mod 10;
      tmp:=tmp div 10;
      chislo[2]:=tmp mod 10;
      tmp:=tmp div 10;
      chislo[3]:=tmp mod 10;
      tmp:=tmp div 10;
      chislo[4]:=tmp mod 10;

      l[tail]:=chislo[1]*1000+chislo[4]*100+chislo[3]*10+chislo[2];//3 дейсвтие
      p[tail]:=head;
      inc(tail);
      if l[tail-1]=m then break;
      l[tail]:=chislo[3]*1000+chislo[2]*100+chislo[1]*10+chislo[4]; //4 действие
      p[tail]:=head;
      inc(tail);
      if l[tail-1]=m then break;
      inc(head);
    end;
DoubleTrouble вне форума Ответить с цитированием
Старый 26.06.2011, 18:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как получить из одного числа другое за минимальное количество операций.
Непонятно что тут имеется под словом - "операция"...
Если это те пункты что указаны в задаче - то ответ сам напрашивается - одной операции хватит для получения нового числа из старого. Если речь идет о операциях в ЯВУ то стоит уточнять атомарность операции - Либо это одна ассемблерная команда, либо одна операция это некий вызов некой функции.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск самого дешёвого пути. Волновой алгоритм girlbuuuger Помощь студентам 16 13.02.2012 20:39
Не работает код. Надо поправить. Инферныч Помощь студентам 0 11.06.2010 11:05
Волновой алгоритм (алгоритм Ли) MrRockchip Общие вопросы C/C++ 4 10.05.2010 13:26
Волновой алгоритм сферическая волна ArtInt Общие вопросы Delphi 2 24.04.2010 15:43
Волновой алгоритм поиска Merkator Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 12.02.2009 16:15