【问题标题】:Finding a path to X in a matrix在矩阵中找到 X 的路径
【发布时间】:2015-06-01 17:27:42
【问题描述】:

给定一个 n x n 矩阵作为输入,我们必须找出从 (0,0) 到 X(矩阵中间)的 1 的路径是否存在。例如输入是

1 1 1 0 0
1 0 0 0 0 
1 0 X 1 1
1 0 0 0 1
1 1 1 1 1

输出应该为真,因为我们有这条路径

1
1
1   X 1 1
1       1
1 1 1 1 1

有人可以解释一下更好的方法吗?谢谢。这是我的算法:

输入矩阵是 A,其中 X 由任何正数表示 访问的矩阵[n][n] 被初始化为零 最初标志=0; 调用 find(0,0,&flag) 然后我们检查 flag=1 是否存在路径。

void find(int i,int j,int * flag)
{

    visited[i][j]=1;

    if(i==n/2)and(j==n/2)
    {
    *flag=1;
     return
    }

    if(A[i+1][j]>0)and(visited[i+1]==0)and(i+1<n)
    find(i+1,j,flag);

    if(A[i-1][j]>0)and(visited[i-1]==0)and(i-1>0)
    find(i-1,j,flag);

    if(A[i][j+1]>0)and(visited[j+1]==0)and(j+1<n)
    find(i,j+1,flag);

    if(A[i][j-1]>0)and(visited[j-1]==0)and(j-1>0)
    find(i,j-1,flag);
}

【问题讨论】:

  • 是什么让你说它是指数级的?请张贴代码。

标签: algorithm matrix path


【解决方案1】:

您的递归算法可能是 DFS,它不维护 visited 集,因此会多次重新扩展节点。

可以通过添加和维护一个visited集合来解决,如果某个节点在集合中,则跳过它,不要重新展开它。

更好的选择是使用BFS 而不是 DFS。 BFS 还默认维护了一个visited 集合(如果您想稍后再查找路径,则设置为parent),并且还保证找到从源到目标的最短路径。

BFS 的伪代码:

q = new empty queue
parent = {} //new empty dictionary
q.enqueue((0,0))
parent[(0,0)] = null
while q is not empty:
    current = q.dequeue()
    if current is the target x:
         return findPath(parent, current)
    for each neighbor n of current:
       if n is a key in parent:
          continue
       q.add(n)
       parent[n] = current

findPath(parent, target):
    l = new list
    while (target != null):
       l.add(target)
       target = parent[target]  

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2022-12-20
    • 2012-11-24
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多