Чтобы найти кратчайший путь в лабиринте использую волновой алгоритм, его сделал, но вот кратчайший путь не получается восстановить.
Есть 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 - стена
Подскажите, как найти кратчайший путь?