原题链接:https://www.acwing.com/problem/content/175/
说人话,就是输出矩阵中对应位置为0的点到矩阵中为1的点的最短曼哈顿距离。
连一个虚拟原点,到1的距离为0,反过来看,就变成
虚拟原点到其他不是1的点的最短距离,利用BFS,可以求
得到每个点的最短距离,也就是每个点到1的最短距离了
//连一个虚拟原点,到1的距离为0,反过来看,就变成
//虚拟原点到其他不是1的点的最短距离,利用BFS,可以求
//得到每个点的最短距离,也就是每个点到1的最短距离了
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N=1010, M=N*N;
int n, m;
char g[N][N];//读入的数据之间没有空格,想要整行读入,需要用char数组
PII q[M];
int dist[N][N];
void bfs()
{
int dx[]={-1, 0, 1, 0}, dy[]={0, -1, 0, 1};
memset(dist, -1, sizeof dist);
int hh=0, tt=-1;
//先把1全部入队
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(g[i][j]=='1')
{
// 是1的点,距离为0。
dist[i][j]=0;
q[++tt]={i, j};
}
while(hh<=tt)
{
PII t=q[hh++];
for(int i=0; i<4; i++)
{
int a=t.x+dx[i], b=t.y+dy[i];
if(a<1 || a>n || b<1 ||b>m) continue;
if(dist[a][b]!=-1) continue;
dist[a][b]=dist[t.x][t.y]+1;
q[++tt]={a, b};
}
}
}
int main()
{
cin>>n>>m;
// char的话可以整行读
for(int i=1; i<=n; i++) scanf("%s", g[i]+1);
bfs();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
printf("%d ",dist[i][j]);
puts("");
}
return 0;
}