Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ОШШШИБКА - Нужна помощь, всякая фигня 
:(
    Опции темы
Alexandr87
Дата 7.1.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Вощем короч, решил тут к олимпиаде по паскалю подготовиться - синтаксис вспомнить. Вот поэтому решил решить несколько задач. Ну решение слау методом гаусса написал.
Терь вторая задачка:
Короч есть матрица (карта) - элементы которой данные типа byte, соссно цифры от 0 до 9.
Есть начальная точка движения, конечная точка движения - для простоты левый верхний угол (старт), правый нижний угол(енд),двигаться можно только по горизонтали и вертикали, при этом проходя по клеткам нужно чтобы сумма цифр всех клеток по которым прошел была минимальна. Вощем сделал рекурсией, !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!но паскаль ругается зараза не хочет компилить, не знаю чё ему не нравиться. При том ошибка вылезает не в самом паскале, а при компиляции вылезает сабж, аля месаж бокс (две кнопки закрыть, пропустить). Заголовок 16 разрядная подсистема MS-DOS, ну и там дальше, типа процессор NTVDM обнаружил недопустимую инструкцию.
CS:01d3 IP:044f OP:63 ba a3 ff 00. Для заврешения работы нажмите кнопку "Закрыть".

Код программы
Код

{Algoritm obhoda karti}
program kart;
uses crt;
var
mas:array[1..10,1..10] of byte;
masb:array[0..11,0..11] of byte;
mascor:array[1..100,1..2] of byte;
kolcor:integer;
prio:array[1..4] of byte; {1-UP, 2-DOWN, 3-RIGHT, 4-LEFT}


n,m:byte;
x,y:byte;
f:text;
sum,oldsum:integer;

procedure cout(code:integer);
var x,y:byte;
begin
writeln;
writeln;
if code=0 then
  for x:=0 to n+1 do
  begin
       for y:=0 to m+1 do
           write(masb[x,y]:2);
       writeln;
  end;
if code=1 then
  for x:=1 to n do
  begin
       for y:=1 to m do
           write(mas[x,y]:2);
       writeln;
  end;
end;

procedure gomap(c1,c2,prior:byte);
var nc1,nc2:byte;
begin
{where go}
nc1:=c1;
nc2:=c2;
if prior=1 then {UP}
  nc1:=c1-1;
if prior=2 then {DOWN}
  nc1:=c1+1;
if prior=3 then {RIGHT}
  nc2:=c2-1;
if prior=4 then {LEFT}
  nc2:=c2+1;
{map set}
{mapb[nc1,nc2]=3;}

if ((masb[nc1,nc2]<>0)and(masb[nc1,nc2]<>3)) then {main cond}
begin
    if (masb[nc1,nc2]<>4) then
    begin
         masb[nc1,nc2]:=3;
         gomap(nc1,nc2,prio[1]);
         gomap(nc1,nc2,prio[2]);
         gomap(nc1,nc2,prio[3]);
         gomap(nc1,nc2,prio[4]);
    end
    else   {if end go point}
    begin
         sum:=0;
         for x:=1 to n do
             for y:=1 to m do
                 if masb[x,y]=3 then
                    sum:=sum+mas[x,y];
         if sum>oldsum then
         begin
              kolcor:=1;
              oldsum:=sum;
              for x:=1 to n do
                  for y:=1 to m do
                      if masb[x,y]=3 then
                      begin
                           mascor[kolcor,1]:=x;
                           mascor[kolcor,2]:=y;
                           kolcor:=kolcor+1;
                      end;
        { writeln(sum);}
         end;
    end;

end;

masb[nc1,nc2]:=1;
end;


begin
clrscr;
{draw karta}
assign(f,'kart.in');
reset(f);
readln(f,n,m);
for x:=1 to n do
begin
    for y:=1 to m do
    begin
        read(f,mas[x,y]);
        masb[x,y]:=1;
    end;
    readln(f);
end;
close(f);
{writeln('asd');}
for x:=0 to m+1 do
begin
    masb[0,x]:=0;
    masb[n+1,x]:=0;
end;
for x:=0 to n+1 do
begin
    masb[x,0]:=0;
    masb[x,m+1]:=0;
end;
masb[1,1]:=3;
masb[n,m]:=4;
for x:=1 to 4 do  {set prioritets of move}
   prio[x]:=x;
oldsum:=0;

gomap(1,1,prio[1]);
gomap(1,1,prio[2]);
gomap(1,1,prio[3]);
gomap(1,1,prio[4]);
cout(0);
cout(1);
writeln(sum);

readln;
end.



входные данные
5 5
0 9 2 3 4
0 3 2 7 4
2 9 3 2 1
9 1 1 1 3
0 5 3 2 0

Это сообщение отредактировал(а) Alexandr87 - 7.1.2005, 19:02
PM Jabber   Вверх
Zero
Дата 7.1.2005, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Alexandr87 я конечно не проверял всю прогу, но первое что мне бросилось в глаза, это то что у тебя файловая переменная f определена как текстовый файл, а ты его в программе вызываешь как типизированый "*.in"
Но наверняка это не единственная ошибка, просто у меня щас сессия нету много времени, может ещё кто-нить далее поможет. smile

Цитата(Alexandr87 @ 7.1.2005, 18:36)
но паскаль ругается зараза не хочет компилить, не знаю чё ему не нравиться.

Я тоже не знаю, у меня компилится но не запускается, из-за остальных ошибок. smile
PM MAIL ICQ   Вверх
Alexandr87
Дата 7.1.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Zero
Спасибо конечно за участие, но насчет того что сказал ты - тип файловой переменной влияет только на работу с файлом.
Название может быть каким угодно, ну ессесно зависит от ОСи(напр в дос 8.3)
PM Jabber   Вверх
Fedor
Дата 7.1.2005, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Zero Он текстовый. Эт того, какое у него расширение, не зависит, типизированный он или нет smile
Добавлено @ 19:19
Alexandr87 Код смотреть лом, и вообще эта задача не так решается. Попробую объяснить:
может, слышал когданить про алгоритм волны? вот тут он и есть.

Идешь это первой клетки ко всем соседям. Соседей этих сохраняешь в очередь, а в ячейки новой матрицы в клетки, соотв этим соседям, пишеш путь от первой вершины. Далее береш первого из очереди и ДЛЯ ВСЕХ его соседей делаешь ту же саму операцию только с оговрокой что если ты эту клетку уже находил, то идешь в нее только в том случае если это уменьшает число, которое в ней находится.
Если нужно потом узнать путь, по которому прошел, то идешь от последней клетки второй матрицы (матрицы путей) и берешь на каждом шаге минимального ее соседа. Так получаешь с обратной стороны твой путь.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
volvo877
Дата 7.1.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Alexandr87
У тебя проблема в процедуре gomap - она у тебя рекурсивная, и скорее всего ты ошибся с условием выхода - происходит переполнение стека...
PM MAIL   Вверх
Alexandr87
Дата 7.1.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Цитата(Fedor @ 7.1.2005, 19:11)
Zero Он текстовый. Эт того, какое у него расширение, не зависит, типизированный он или нет smile
Добавлено @ 19:19
Alexandr87 Код смотреть лом, и вообще эта задача не так решается. Попробую объяснить:
может, слышал когданить про алгоритм волны? вот тут он и есть.

Идешь это первой клетки ко всем соседям. Соседей этих сохраняешь в очередь, а в ячейки новой матрицы в клетки, соотв этим соседям, пишеш путь от первой вершины. Далее береш первого из очереди и ДЛЯ ВСЕХ его соседей делаешь ту же саму операцию только с оговрокой что если ты эту клетку уже находил, то идешь в нее только в том случае если это уменьшает число, которое в ней находится.
Если нужно потом узнать путь, по которому прошел, то идешь от последней клетки второй матрицы (матрицы путей) и берешь на каждом шаге минимального ее соседа. Так получаешь с обратной стороны твой путь.

Может конечно я и ошибаюсь, но помоему мой алгоритм как раз это и делает(это насчет очередности).
Добавлено @ 19:31
volvo877
Дык я понимаю, что она рекурсивная, но помоему условия выхода логически построено правильно. Блин стек оферфло
PM Jabber   Вверх
Fedor
Дата 7.1.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Это лучше сделать без рекурсии. С очередью.
Тогда и понятнее будет, и быстрее радотать. Я пока не уверен, что у тебя алгоритм правильный.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Zero
Дата 7.1.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Fedor @ 7.1.2005, 19:11)
От того, какое у него расширение, не зависит, типизированный он или нет
Кхе...Кхе... Если честно то не задумывался над этим, и всегда в текстовых файлах использовал расширение *.txt. smile
Цитата(Fedor @ 7.1.2005, 19:44)
Это лучше сделать без рекурсии. С очередью.
Тогда и понятнее будет, и быстрее радотать.

Вот насчёт понятности согласен, а на счёт быстроты нет... Мы на САПР такой фигнёй в основмном и занимаемся, связанной с улучшением и модификацией программ, и на сколько я помню, то рекурсии для быстроты и придуманы. Даже при оценки достоинств алгоритма, если он использует в основе рекурсию, то говорят что он имеет один из пунктов достоинства "Высокое быстродействие".
PM MAIL ICQ   Вверх
Fedor
Дата 7.1.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата(Zero @ 7.1.2005, 19:26)
Вот насчёт понятности согласен, а на счёт быстроты нет... Мы на САПР такой фигнёй в основмном и занимаемся, связанной с улучшением и модификацией программ, и на сколько я помню, то рекурсии для быстроты и придуманы. Даже при оценки достоинств алгоритма, если он использует в основе рекурсию, то говорят что он имеет один из пунктов достоинства "Высокое быстродействие".


Хорошо. У меня у алгоритма сложность n*m. А у вас?
Добавлено @ 20:55
И я еще раз повторю, что по-моему, вышеуказанный код неправильный не только потому, что он не компилируется, а неправильный идейно.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fedor
Дата 7.1.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Код
const
MaxN = 100;

var
q:array[1..MaxN*MaxN] of record
  x,y:byte;
end;
head,tail:integer;

procedure EnQueue(x,y:word);
begin
if head=MaxN*MaxN then head:=1 else inc(head);
Q[head].x:=x; Q[head].y:=y;
end;

procedure DeQueue(var x,y:word);
begin
if tail=MaxN*MaxN then tail:=1 else inc(tail);
x:=Q[tail].x; y:=Q[tail].y;
end;


var
a,b:array[0..MaxN+1,0..MaxN+1] of integer;
curx,cury:word;
m,n:word;
i,j:word;
fin,fout:text;
begin
for i:=1 to MaxN do
 for j:=1 to MaxN do
   b[i,j]:=maxInt;


assign(fin,'kart.in'); reset(fin);
readln(fin,n,m);
for i:=1 to n do
 begin
  for j:=1 to m do
    read(fin,a[i,j]);
  readln(fin);
 end;
close(fin);

for i:=1 to MaxN do
 begin
  b[0,i]:=-1;
  b[i,0]:=-1;
  b[n+1,i]:=-1;
  b[i,m+1]:=-1;
 end;


curX:=1; curY:=1;
EnQueue(curx,curY);
b[cury,curx]:=a[cury,curx];

while head<>tail do
 begin
   DeQueue(curX,curY);
   if b[cury+1,curx]>b[cury,curx]+a[cury+1,curx] then {DOWN}
    begin
      b[cury+1,curx]:=b[cury,curx]+a[cury+1,curx];
      EnQueue(curx,cury+1);
    end;
   if b[cury-1,curx]>b[cury,curx]+a[cury-1,curx] then {UP}
    begin
      b[cury-1,curx]:=b[cury,curx]+a[cury-1,curx];
      EnQueue(curx,cury-1);
    end;
   if b[cury,curx+1]>b[cury,curx]+a[cury,curx+1] then {RIGHT}
    begin
      b[cury,curx+1]:=b[cury,curx]+a[cury,curx+1];
      EnQueue(curx+1,cury);
    end;
   if b[cury,curx-1]>b[cury,curx]+a[cury,curx+1] then {TOP}
    begin
      b[cury,curx-1]:=b[cury,curx]+a[cury,curx+1];
      EnQueue(curx-1,cury);
    end;
 end;
writeln(b[n,m]);
end.


Вот. Разбирайтесь. На исходном примере получилось 12.

Alexandr87 Если это для олимпиады, значит и тесты должны быть. Я не слишком уверен. На скорую руку набивал.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Alexandr87
Дата 8.1.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Нет, это хер знает с какой плимпиада, хер знает какой давности, спасибо, щас посотрю
PM Jabber   Вверх
Fedor
Дата 8.1.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Без выражений плз


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Pakshin A. S.
Дата 8.1.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Alexandr87
М
 
М-да... некрасиво получается...

PM   Вверх
Alexandr87
Дата 8.1.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



Fedor
Ты гений, блин - прикольное решение, и главно работает шустро. Особо благодарю, как тока смогу плюсы раздовать - влеплю те.
И в правду очень интересное решение, определять кол-во собранных очков до точки, и тут же не запускать шарилку повторно если меньше...... Большое тебе спасибо.

Это сообщение отредактировал(а) Alexandr87 - 8.1.2005, 17:42
PM Jabber   Вверх
Fedor
Дата 8.1.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата(Alexandr87 @ 8.1.2005, 16:40)
Fedor Ты гений

Я знаю. smile
Добавлено @ 18:00
А еще я знаю, что я очень скромный smile


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.