给定一个1和0的矩阵,其中0表示空闲路径,1表示阻塞区域。您可以在8个方向中的任何一个方向移动。找到从源到目的地的最短路径。
我能够提出的解决方案,其中dp[i,j]
存储起始顶点的最小距离:
recursion(int i, int j , int sum)
{
if(!issafe(i,j) || isvisited[i,j]) // within bounds
return ;
if(matrix(i,j)==0)//blocked
return ;
isvisited[i,j]=true;
dp[i,j] = min(dp[i,j] , sum);
// directions have usual meaning
recursion(east ,sum+1); // i , j+1
recursion(north , sum+1); //i-1 , j
recursion(west , sum+1);
recursion(south , sum+1);
recursion(north-east , sum+1);
recursion(north-west , sum+1);
recursion(south-east , sum+1);
recursion(south-west , sum+1);
isvisited[i,j]=false;
return;
}
现在我怀疑的是假设我们可以从8个位置到达[i,j]。一旦我从位置1到达它,说明分钟。 path是x个单位,我递归地检查它的邻居。现在,我来自路径2并找到那个分钟。 path(以前为x)现在不是x,现在再次递归检查。所以,我在第1步做了额外的计算,这是不需要的。有没有什么方法可以在我找到min之后递归检查邻居。当前单元格的路径(可从所有8个位置到达)?
答案 0 :(得分:1)
这是非加权图表中的shortest path problem,可由BFS解决。
在这里,您的图表是G=(V,E)
其中
V = { all cells in the matrix}
E= { (v1,v2) | can move from cell v1 to cell v2 }
请注意,您的方法是DFS的变体,使用其他数据[dp
数组]
更高级的方法是bi-directional搜索或A* algorithm(manhattan distances作为启发式功能)。
bfs伪代码:
BFS(source,destination):
visited <- {} //empty dictionary
queue <- new queue
queue.add (source)
visited.add(source,null)
while (! queue.isEmpty()):
v <- queue.pop()
if v == destination:
return getPath(visited, v)
for each edge (v,u):
if u is not a key in visited:
visited.add(u,v)
queue.add(u)
getPath(visited,v):
list <- new linked list
while (v != null):
list.addFirst(v)
v <- visited.get(v)
return list
此解决方案的时间复杂度为O(min{|V|,8^d})
- 其中d
是最短路径的长度,|V|
是矩阵中的单元格数。