使用递归来查找2D数组中的路径

时间:2010-04-13 17:06:01

标签: 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)。

function search(a,b)
  from a to b
    if element(i,j) != 0 then
      store value of element
      search(j,3)

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

使用Floodfill算法可以轻松实现路径查找,该算法可以以递归形式编写,如

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, []);  

然而,这是非常低效的,并且一旦你到达更大的网格就会导致堆栈溢出...更好的方法是制作一个软件堆栈......

此外,它只找到有效的路径,但不是最有效的路径。您将不得不为算法添加计数[这不应该花费太多精力,希望]