2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Поиск кратчайшего пути в лабиринте
Сообщение17.11.2011, 19:56 


14/07/11
6
Добрый день.
Будучи студентом,необходимо сдавать задания.
И есть у меня задание по информатике.
Одна там задача беспокоит меня,и задача эта про нахождение кратчайшего пути в лабиринте.
Ладно кратчайший,сначала попытался написать просто поиск пути.
Сделать надобно её именно через рекурсию.
Написал,но она работает только для лабиринтов,в которых нет "петель",то есть круговых путей.
Рекурсивная функция имеет примерно такой вид:
(код под оффтопиком,дабы не засорять экран)

(Оффтоп)

Код:
int step(int x,int y,int xp,int yp,int st)
{
   int v,i;
   v=st;
   if((x==n-1)*(y==m-1)) //финальный шаг
   {
      g=v+1;
      s[g].x=x;
      s[g].y=y;
      return 1;
   }

   for(i=0;i<4;i++)
   {
                  
      if((ms[x+dx[i]][y+dy[i]]==0)&&(x+dx[i]>-1)&&(y+dy[i]>-1)&&(x+dx[i]<n)&&(y+dy[i]<m)&&((x+dx[i])!=xp||(y+dy[i])!=yp))
      {
         v++;
         if(step(x+dx[i],y+dy[i],x,y,v)==1)
         {
            s[v].x=x;
            s[v].y=y;
            return 1;
         }
      }
   }
   return 0;
}

dx[i]-это изменение x при движении влево/вверх/вправо/вниз,dy[i]-аналогично.
xp,yp-координаты предыдущей клетки,чтобы программа не скакала,как дурная,по двум клеткам раз за разом.
st-номер клетки в данном пути.
Пусть 1-стена,0-путь. Тогда в лабиринте:
0 0 0 1 1
1 1 0 0 0
1 1 0 1 0
1 1 0 1 0
Программа спокойно ищет выход.
А вот в лабиринте вида:
0 0 0 0 0
1 1 0 1 0
1 1 0 0 0
1 1 1 1 0
она зависает и просто ходит по кругу,отмеченному красным.
Как можно с этим бороться?
Как изменить алгоритм?
Я пытался сделать список "развилочных точек",в которых больше трех путей,чтобы программа на эти точки не ходила более одного раза,однако результата не принесло никакого.

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение17.11.2011, 20:27 
Заслуженный участник


04/05/09
4587
Надо помечать те места, где уже был, и не входить в них.
Рекурсия не подходит для поиска кратчайшего пути. Она достаточно быстро найдёт какой-нибудь путь, но для поиска кратчайшего придётся перебирать все возможные пути, что чрезвычайно неэффективно.
Вам нужен поиск вширь (BFS - breadth first search), который я даже не знаю, возможно ли реализовать рекурсивно.

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение17.11.2011, 21:43 
Заслуженный участник


27/04/09
28128
А волновой алгоритм тут полезным ли не будет?

Ах рекурсия… Тогда нечего мне сказать. Если только вводить доаолнительные параметры какие-нибудь к функции.

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение18.11.2011, 06:02 
Заслуженный участник


26/07/09
1559
Алматы
Любой цикл можно переписать как рекурсию (формально).

P.S.: В данном случае волновая трассировка и BFS -- это одно и то же.

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение22.11.2011, 12:52 


01/07/08
836
Киев
DrBreen в сообщении #504896 писал(а):
чтобы программа не скакала,как дурная,по двум клеткам раз за разом.

Несколько обидно за программу, она послушна воле своего творца. :lol:
DrBreen в сообщении #504896 писал(а):
Как изменить алгоритм?

Проверить соответствие Вашей реализации( программы) выбранному алгоритму, т.е. избавиться от ошибок, которые как показывает опыт, остаются даже в работающих программах.
Те грабли на которые Вы наступили в теории графов называются циклами. То в чем Вы "обвинили" свою реализацию минимальный цикл.
Алгоритм Вы никак не описали. Про реализацию, Вы не сообщили описание глобальных переменных, поэтому получили от ЗУ общие указания. С уважением,

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение23.11.2011, 02:44 
Заслуженный участник


26/07/09
1559
Алматы
Кстати, про проблему циклов при работе волнового алгоритма. Неплох прием с разрушением графа распространяющейся волной -- циклы тоже разрушаются (и память чуть-чуть экономится).

 Профиль  
                  
 
 Re: Поиск кратчайшего пути в лабиринте
Сообщение23.11.2011, 15:17 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Странно, что волновой алгоритм (который я знаю) не шарахается от циклов, которых куча на доске из квадратных клеток. :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group