Javascript 使用递归在二维数组中查找路径

Javascript 使用递归在二维数组中查找路径,javascript,arrays,recursion,traversal,Javascript,Arrays,Recursion,Traversal,我正在为我的a级考试做一个项目。它涉及到寻找网络的最大流量,我正在使用javascript 我有一个2D数组,数组中的值表示两点之间的距离。阵列的一个示例: 0 2 2 0 0 0 1 2 0 0 0 2 0 0 0 0 我想我需要使用递归技术来找到一条路径;下面是一些伪代码,假设数组是4x4。a是(0,0),b是(3,3) 我想知道这是否是深度优先搜索的正确结构。谢谢任何帮助。 认真考虑使用BFS。是的,但是路径查找方法是固定的-BFS,它保证了最坏的情况O(V*E^2),而DFS不是这种情

我正在为我的a级考试做一个项目。它涉及到寻找网络的最大流量,我正在使用javascript

我有一个2D数组,数组中的值表示两点之间的距离。阵列的一个示例:

0 2 2 0
0 0 1 2
0 0 0 2
0 0 0 0
我想我需要使用递归技术来找到一条路径;下面是一些伪代码,假设数组是4x4。a是(0,0),b是(3,3)


我想知道这是否是深度优先搜索的正确结构。谢谢任何帮助。

认真考虑使用BFS。是的,但是路径查找方法是固定的-BFS,它保证了最坏的情况O(V*E^2),而DFS不是这种情况。V是顶点数,E是边数。如果仍然坚持DFS,那么至少应该检查循环中下一个要访问的节点是否尚未访问,以防止永久递归。您可以使用布尔数组。

使用泛洪填充算法可以轻松实现寻路,该算法可以以递归形式编写,如下所示:

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, []);  
然而,这是非常低效的,一旦你到达更大的ish网格,就会导致堆栈溢出。。。更好的方法是制作一个软件堆栈


而且,它只找到一条有效的路径,而不是最有效的路径。您必须将计数添加到算法中[希望不会花费太多精力]

对不起,数组中的值表示哪两个点之间的距离?二维数组中的单个位置只指定一个点,对吗?想象行标题和列标题(ABCD),这样三个方向的点和一个方向的点就是C和A之间的距离。
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, []);