Algorithm 距离最近的单元格1的距离超过时间限制

Algorithm 距离最近的单元格1的距离超过时间限制,algorithm,graph,programming-languages,breadth-first-search,Algorithm,Graph,Programming Languages,Breadth First Search,给定一个大小为nxm的二元矩阵。任务是为每个单元找到矩阵中最近的1的距离。距离计算为| i1–i2 |+| j1–j2 |,其中i1,j1是当前单元格的行号和列号,i2,j2是值为1的最近单元格的行号和列号 输入: 输入的第一行是一个整数T,表示测试用例的数量。然后,T测试用例随之出现。每个测试用例由2行组成。每个测试用例的第一行包含两个整数M和N,表示矩阵的行数和列数。然后在下一行中是矩阵mat的N*M空间分隔值 输出: 对于新行中的每个测试用例,用空格分隔的单行打印所需的距离矩阵 Cons

给定一个大小为nxm的二元矩阵。任务是为每个单元找到矩阵中最近的1的距离。距离计算为| i1–i2 |+| j1–j2 |,其中i1,j1是当前单元格的行号和列号,i2,j2是值为1的最近单元格的行号和列号

输入: 输入的第一行是一个整数T,表示测试用例的数量。然后,T测试用例随之出现。每个测试用例由2行组成。每个测试用例的第一行包含两个整数M和N,表示矩阵的行数和列数。然后在下一行中是矩阵mat的N*M空间分隔值

输出: 对于新行中的每个测试用例,用空格分隔的单行打印所需的距离矩阵

 Constraints:
    1 <= T <= 20
    1 <= N, M <= 500

    Example:
        Input:
        2
        2 2 
        1 0 0 1
        1 2
        1 1

    Output:
    0 1 1 0
    0 0
代码:


您的算法效率不高,因为每次运行BFS只会导致一次单元格更新

您应该从一个不同的角度来解决这个问题,更像是一个泛洪填充:只执行一次BFS遍历,从队列中具有1的所有节点开始。然后,当您延伸到还没有已知距离的单元格时,填充它

以下是适用于该想法的代码:

向量矩阵[],int n,int m{ 国际区[n][m]; 向量q;//在这个方法中,我们有足够的向量
forint i=0;i请提供问题和代码。那么,您的问题是什么?请添加编程语言标记时间限制,因为代码效率低下。我尝试了与您类似的解决方案。上面说时间限制已超过。请看一看并提出错误。这是长的。这是链接。我不明白:您链接到的问题在哪里您已经接受了一个答案。所以我想您没有超时问题。如果您仍然接受,那么为什么您将该答案标记为已接受?
Testcase 1:
1 0
0 1
0 at {0, 1} and 0 at {1, 0} are at 1 distance from 1s at {0, 0} and {1, 1} respectively.
bool isSafe(int currRow,int currCol,int n,int m){
    return currRow>=0 && currRow<n && currCol>=0 && currCol<m;
}

int bfs(int currX,int currY,vector<int> matrix[],int n,int m) {
    queue<pair<int,int>> q;
    q.push(make_pair(currX,currY));
    static int rows[]={0,-1,0,1};
    static int columns[]={1,0,-1,0};
    int flag=0;
    int dist=0;
    while(flag==0 && !q.empty()) {
        pair<int,int> p=q.front();
        q.pop();
        for(int i=0;i<4;i++) {
            if(isSafe(p.first+rows[i],p.second+columns[i],n,m)) {
                if(matrix[p.first+rows[i]][p.second+columns[i]]) {
                    dist=abs(p.first+rows[i]-currX)+abs(p.second+columns[i]-currY);
                    flag=1;
                    break;
                } else {
                    q.push(make_pair(p.first+rows[i],p.second+columns[i]));
                }
            }
        }
    }

    return dist;

} 

void minDist(vector<int> matrix[],int n,int m) {
    int dist[n][m];
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            if(matrix[i][j]) {
                dist[i][j]=0;
            } else {
                dist[i][j]=bfs(i,j,matrix,n,m);
            }
        }
    }
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            cout<<dist[i][j]<<" ";
        }

    }
}

Agorithm:
1. If matrix[i][j] == 1
      dist[i][j]=0
   else
      dist[i][j]= bfs with source as (i,j)