当前位置: 首页 > 知识库问答 >
问题:

超过了具有%1的最近单元格距离的时间限制

法弘亮
2023-03-14

给定一个大小为N×m的二进制矩阵,任务是为每个单元寻找矩阵中最近的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

说明:

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)

共有1个答案

罗河
2023-03-14

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

您应该从一个不同的角度来处理这个问题,更像是一个泛洪填充:只执行一次BFS遍历,从队列中有1的所有节点开始。然后在扩展到还没有已知距离的单元格时,将其填入。

下面是您的代码,它适应了这个想法:

void minDist(vector<int> matrix[],int n,int m) {
    int dist[n][m];
    vector<pair<int,int>> q; // in this method, we have enough with vector

    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            if(matrix[i][j]) {
                dist[i][j]=0;
                q.push_back(make_pair(i,j));
            } else {
                dist[i][j]=-1; // undefined distance
            }
        }
    }
    // bfs
    static int rows[]={0,-1,0,1};
    static int columns[]={1,0,-1,0};
    int curdist=1;
    while(!q.empty()) {
        vector<pair<int,int>> q2; // use separate vector for the next extension
        while(!q.empty()) {
            pair<int,int> p=q.back();
            q.pop_back();
            for(int i=0;i<4;i++) {
                if(isSafe(p.first+rows[i],p.second+columns[i],n,m)) {
                    if(dist[p.first+rows[i]][p.second+columns[i]] == -1) {
                        dist[p.first+rows[i]][p.second+columns[i]] = curdist;
                        q2.push_back(make_pair(p.first+rows[i],p.second+columns[i]));
                    }
                }
            }
        }
        q = q2; // Now copy that extension back into the original vector
        curdist++;
    }
    // output
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            cout<<dist[i][j]<<" ";
        }
        cout<<"\n";
    }
}
 类似资料:
  • 给定一个大小为N×m的二进制矩阵,任务是为每个单元寻找矩阵中最近的1的距离。该距离计算为I1-I2+J1-J2,其中i1、j1是当前单元的行号和列号,i2、j2是最近单元的行号和列号,其值为1。 输入:输入的第一行是表示测试用例数量的整数T。然后T测试用例就会接踵而至。每个测试用例由2行组成。每个测试用例的第一行包含两个表示矩阵行数和列数的整数M和N。然后在下一行中是矩阵(mat)的n*m个空格分

  • 问题内容: 我正在尝试创建一个表格,其中每个单元格具有背景颜色,并且它们之间具有空白。但我似乎在执行此操作时遇到了麻烦。 我尝试设置边距,但似乎没有效果。 如果我对填充执行相同的操作,则可以,但是在单元格之间没有间距。 有人可以帮我吗? 问题答案: 使用元素上的属性设置单元格之间的间距。 确保设置为(否则每个单元格之间将有一个单独的边框,而不是每个单元格之间可能会有间隔的单独边框)。

  • 给定一个数组arr,求最大abs(i-j),使abs(arr[i]-arr[j]) 经过深思熟虑,我想出了以下算法, 对于每个元素的排序,我们进行二进制搜索的复杂性是O(log n),,。总体时间复杂度为O(nlogn*2*logn),是渐近的O(nlogn)。 这种方法正确吗?是否有可能制定线性时间解决方案?我尝试使用哈希图,但发现很难得出线性解决方案。

  • 我想有一个随机列表,其中1的出现率为10%,其余项目为零。这个列表的长度是1000。我希望这些值以随机顺序排列,以便它们之间有一个可调整的最小距离。例如,如果我选择一个值3,列表将如下所示: 实现这一点最优雅的方法是什么? 编辑我被要求提供更多的信息并表现出一些努力。 这是一项研究,其中0表示一种刺激,1表示另一种刺激,我们希望刺激类型1之间有一个最小距离。 到目前为止,我通过以下方式实现了这一目

  • 我想要的是让第一个textField更靠近第一个jlabel,在第一个textField和第二个jlabel之间有一些空间,像这样: JLabel:JTEXTFIELD-----(spaceeee)-------JLabel:JTEXTFIELD 但我所改变的一切都不能接近我想要的,你看:

  • 我正在学习CLR中的一节,它描述了使用分而治之的方法,使用两点之间的欧几里德距离来找到最近的点对。 有一个问题,要求找到最近的点对之间的manhatten距离,使用类似的方法。但是,我不能把握两者之间的区别。以下是我能想到的: 3)递归到我们的点子集<=3为止(在这种情况下使用蛮力) 4)最小距离可以是从任何一个递归调用返回的距离--称它为D。 5)找到线“L”周围2D宽度内所有点,然后对于每个这