【多起点到终点最短距离】 矩阵距离

传送门

题意

给定一个\(n\times m\)的矩阵,输出一个\(n\times m\)的矩阵\(B\)

  • \(B[i][j]=\min _{1 \leq x \leq N, 1 \leq y \leq M, A[x][y]=1} \operatorname{dist}(A[i][j], A[x][y])\)

题解

  • 将所有可能的起点进入队列

  • 曼哈顿距离就是移动步数,只记录第一次到达时候的距离

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
const int N=1010;
char g[N][N];
int dist[N][N];
int n,m;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void bfs()
{
    memset(dist,-1,sizeof dist);
    queue< pair<int,int> >q;
    rep(i,1,n) rep(j,1,m)
    {
        if(g[i][j]=='1') q.push(make_pair(i,j)),dist[i][j]=0;
    }
    while(q.size())
    {
        pair<int,int> t=q.front();
        q.pop();
        
        rep(i,0,3)
        {
            int tx=t.first+dx[i],ty=t.second+dy[i];
            if(tx<1 || tx>n || ty<1 || ty>m) continue;
            if(dist[tx][ty]!=-1) continue;
            dist[tx][ty]=dist[t.first][t.second]+1;
            q.push(make_pair(tx,ty));
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    rep(i,1,n) scanf("%s",g[i]+1);
    
    bfs();
    rep(i,1,n) 
    {
        rep(j,1,m)
            printf("%d ",dist[i][j]);
        puts("");
    }
    
}
posted @ 2020-10-31 13:20  Hyx'  阅读(166)  评论(0)    收藏  举报