Как найти кратчайший путь в лабиринте?

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

Есть 2 вектора:
//карта с 0 и 1, 1 - стена
vector<vector<int>> map;
//карта с ценами путей
vector<vector<int>> tempMap;

В конечной ячейке:
map[finishX][finishY] = 19;
int startX=0; 
int startY=6; 
int finishX=12; 
int finishY=6;

Сам алгоритм:
void FindPath(int startX,int startY,int finishX,int finishY,int upper) 
{ 
   if( upper>20 )
	   return; 
   //если в стартовой ячейке что-то есть
   if(tempMap[startX][startY]<=upper && tempMap[startX][startY] > 0)
	   return; 
   //конец пути
   if( startX == finishX && startY == finishY)
   {
	   tempMap[startX][startY]=upper;
	   return;
   } 
   //если в стартовой ячейке что-то есть
   if(map[startX][startY]>0)
	   return; 
   //увеличиваем стартовую ячейку на 1
   tempMap[startX][startY] = upper; 
    //верхние ячейки
   if(startY > 0)
	   FindPath(startX, startY - 1, finishX, finishY, upper+1); 
   //влево
   if(startX > 0)
	   FindPath(startX - 1, startY, finishX, finishY, upper+1); 
   //влево и вверх
   if(startX > 0 && startY > 0)
	   FindPath(startX-1,startY-1, finishX, finishY, upper+1); 
   //вправо
   if(startX < col)
	   FindPath(startX + 1, startY, finishX, finishY, upper+1); 
   //вниз
   if(startY < col)
	   FindPath(startX,startY + 1, finishX, finishY, upper+1); 
   //вправо и вниз
   if(startY < col && startX < col)
	   FindPath(startX+1,startY+1, finishX, finishY, upper+1); 
};


После прохода волнового алгоритма лабиринт выглядит так:
0 0 0 0 0 0 0 0 0 0 0 0 0
0 7 8 9 10 11 12 13 14 15 16 17 0
0 6 7 8 9 10 11 12 13 14 15 16 0
0 5 6 7 8 9 10 11 12 13 14 15 0
0 4 5 6 7 8 9 10 11 12 13 14 0
2 3 4 5 6 7 8 9 10 11 12 0 15
1 0 4 5 6 7 8 9 10 11 0 13 14
2 0 5 5 6 7 8 9 10 11 0 14 14
0 0 6 6 6 7 8 9 10 11 0 15 0
0 0 7 7 7 7 8 9 10 11 0 15 0
0 0 8 8 8 8 8 9 10 11 0 14 0
0 0 9 9 9 9 9 9 10 11 12 13 0
0 0 0 0 0 0 0 0 0 0 0 0 0


0 - стена

Подскажите, как найти кратчайший путь?
  • Вопрос задан
  • 4050 просмотров
Пригласить эксперта
Ответы на вопрос 5
mlnkv
@mlnkv
JavaScript Developer
Ответ написан
Комментировать
ManWithBear
@ManWithBear
Swift Adept, Prague
Начинаете с конца и идете по уменьшению цифр пока не дойдете до начала.
Ответ написан
CodeInside
@CodeInside
Я бы посоветовал почитать какую-то книгу о теории графов. Помню учили по этому предмету алгоритмы поиска пути. Но это очень давно было. Так что вводив поисковик "книга теория графов". Предмет не сложен, так что можешь сразу искать нужную тебе главу. Думаю понять будет не тяжело.
Ответ написан
Комментировать
@kir_vesp
Web Developer
У тебя есть уже матрица графа используй Алгоритм Дейкстры
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Заведите ещё один массив и кладите в него направление, откуда пришли в данную клетку. Проще всего это направление передать параметром в FindPath. Потом пройдите по этим направлениям от финиша до старта.
Другой вариант - на обратном проходе искать соседнюю клетку со значением tempMap на 1 меньшим, чем в данной клетке, и идти в неё. Это дольше писать и оно чуть медленнее работает, но требует меньше памяти.
Лабиринт действительно на сетке из шестиугольников?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы