Нахождение пути может быть легко достигнуто с помощью алгоритма заливки, который можно записать в рекурсивной форме как
function floodFill(x, y, prevPoints)
{
var prevPoints = prevPoints.concat([]); //make a copy of the points list since JS uses ref
if(grid[x][y].isExit) return prevPoints;
grid[x][y].accessed = true;
prevPoints.push([x, y]);
var result;
var cfr; //cellfillresult
if(grid[x+1][y].isPath && !grid[x+1][y].accessed) cfr = floodFill(x+1, y, prevPoints);
if(cfr != null) result = cfr;
if(grid[x-1][y].isPath && !grid[x-1][y].accessed) cfr = floodFill(x-1, y, prevPoints);
if(cfr != null) result = cfr;
if(grid[x][y+1].isPath && !grid[x][y+1].accessed) cfr = floodFill(x, y+1, prevPoints);
if(cfr != null) result = cfr;
if(grid[x][y-1].isPath && !grid[x][y-1].accessed) cfr = floodFill(x, y-1, prevPoints);
if(cfr != null) result = cfr;
return result;
}
var pathToExit = floodFill(entranceX, entranceY, []);
Однако это крайне неэффективно и приведет к переполнению стека, как только вы доберетесь до сеток большего размера ... Лучший способ сделать это - создать программный стек ...
Кроме того, он находит только работающий путь, но не самый эффективный путь. Вам нужно будет добавить подсчет в алгоритм [который, надеюсь, не потребует слишком много усилий]