【多起点到终点最短距离】 矩阵距离
传送门
题意
给定一个\(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("");
}
}

浙公网安备 33010602011771号