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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2014, 20:26   #1
Adelia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию Волновой алгоритм

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

Задача: «Однажды Джеку Воробью принесли весть, что на одном из Карибских островов спрятан клад. Клад этот спрятан в пещере и путь к нему подобен лабиринту. Пирату удалось выкрасть карту лабиринта. И вот, отважный пират отправился на поиски клада. Продвигаясь по лабиринту, он заплутал. Волшебный компас показал координаты его расположения и координаты места, где расположен клад. Помоги Джеку отыскать клад».
Решение: требуется написать программу, которая по заданному описанию лабиринта и указанию начальных и конечных координат путника напечатает возможный кратчайший путь к кладу.
Формат входных данных:
Первая строка содержит размерность лабиринта, а именно М – число строк в описании лабиринта, и N – число столбцов (M, N <15). Далее вводится числовая матрица MxN, содержащая описание лабиринта, где стены отмечены 1, а проходы - 0. Затем вводятся координаты Джека Воробья (номер строки и столбца (XS, YS), где он находится в текущий момент) и координаты, где расположен клад (XF, YF).
Формат выходных данных:
Найти ближайший путь к кладу и напечатать описание лабиринта вместе с намеченным путем. Начало пути пометить цифрой 2. В местах, где пролегает путь, выставить цифру 3, а в месте клада – 4. Вывести длину пути.

Вот решение этой задачипожалуйста подскажите для чего нужны массивы Mas и Masm, массив Mas как я поняла хранит в себе карту лабиринта)
Код:
Program Voln;
Var 
   XS, YS, XF, YF : Byte; 
   X, Y, K, M, N : Byte;
   Mas, Masm : array [1..15, 1..15] of Byte; 
   Step: byte;
   Procedure Next(Var X, Y : Byte); {поиск клетки, куда возможен шаг}
   Begin
      If (X <M) and (MasM[X, Y] - MasM[X + 1, Y] = 1) then Begin X := X + 1; Exit; End;
      If (X >1) and (MasM[X, Y] - MasM[X - 1, Y] = 1) then Begin X := X - 1; Exit; End;
      If (Y <N) and (MasM[X, Y] - MasM[X, Y + 1] = 1) then Begin Y := Y + 1; Exit; End;
      If (Y >1) and (MasM[X, Y] - MasM[X, Y - 1] = 1) then Begin Y := Y - 1;  Exit; End;
    End;
Begin
     Writeln(‘введите размерность лабиринта’);
     Read(M,N);
     Writeln(‘введите лабиринт: 0-проход, 1-стена’);
     For X := 1 to M  do For Y := 1 to N do read(Mas[X, Y]);
     WriteLn('введите координаты Воробья');
     ReadLn(XS, YS);
     WriteLn('введите координаты клада');
     ReadLn(XF, YF);
{если координаты начальной или конечной точек пути выпадают на стену, то выводится ошибка}
     If (Mas[XS, YS] = 1) or (Mas[XF, YF] = 1) then Begin
                                                                            WriteLn('Компас не исправен!!!');
                                                                           ReadLn;
                                                                           Halt;  End;
{прямая волна}
     MasM[XS, YS] := 1; 
     K := 1;
     Repeat
           K := K + 1;
           For X := 1 to M do For Y := 1 to N do
               If MasM[X, Y] = K - 1 then
                 Begin
                   If (Y <N) and (MasM[X, Y + 1] = 0) and (Mas[X, Y+1] = 0) 
                     Then MasM[X, Y+1] := K;
                   If (Y >1) and (MasM[X, Y-1] = 0) and (Mas[X, Y-1] = 0) 
                     Then MasM[X, Y-1] := K;
                   If (X <M)and (MasM[X+1, Y] = 0) and (Mas[X+1, Y] = 0) 
                     Then MasM[X+1, Y] := K;
                   If (X >1) and (MasM[X-1, Y] = 0) and (Mas[X-1, Y] = 0) 
                      Then MasM[X-1, Y] := K;
                  End;
         If К = M*N then Begin  WriteLn('Клад не достижим!!!'); ReadLn; Halt;  End;
     Until MasM[XF, YF] >0;
    {обратная волна} 
    K := K - 1; step:=K;  X := XF;  Y := YF;   Mas[XF, YF] := 4;
     Repeat
           Next(X, Y);
           Mas[X, Y] := 3;      K := K - 1;
     Until (X = XS) and (Y = YS);
     Mas[XS, YS] := 2;
{вывод результата}
     WriteLn;
     For X := 1 to M do  Begin
              For Y := 1 to N do Write(Mas[X, Y], ' ');
              WriteLn;
                                       End;
     Writeln;
     WriteLn('длина пути: ', step);
     ReadLn;
End.

и не совсем понятен принцип работы обратной волны.Заранее спасибо за любую помощь.
Adelia вне форума Ответить с цитированием
Старый 08.11.2014, 21:35   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В Masm хранится волна. "Обратная волна" - для клетки с кладом с номером K нужно найти прилегающую клетку с номером K - 1 и перейти в неё, продолжать, пока не дойдем до места старта.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.11.2014, 19:44   #3
Adelia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию

Зачем мы обозначаем координаты воробья за 1 MasM[XS, YS] := 1.
если у нас по уловию 1 - это стена?
Adelia вне форума Ответить с цитированием
Старый 09.11.2014, 19:51   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Это обозначение никак не связано с условием. Элементы каждого уровня волны имеют свой порядковый номер. Для лучшего понимания нарисуйте простенький лабиринт на листочке (стенки - закрашенные клетки). Затем поставьте в любую клетку единичку и от неё начните распространять волну, нумеруя клетки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.11.2014, 09:56   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Визуализация поиска пути разными алгоритмами

p.s. всё на английском...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2014, 18:02   #6
Adelia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию

спасибо за ссылку))
Adelia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм! flaminger Помощь студентам 4 05.05.2013 13:04
Волновой алгоритм zokwild Помощь студентам 1 28.11.2012 23:47
волновой алгоритм Delphi The Catalyst Помощь студентам 3 01.12.2011 12:32
Волновой алгоритм поиска Merkator Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 12.02.2009 16:15