代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
char g[N][N];//注意注意注意!!!!!!!! 以后请仔细看看样例的输入
int d[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
typedef pair<int, int> PII;
queue<PII> q;
int n,m;
void bfs()
{
memset(d, -1, sizeof d);
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
{
if(g[i][j]=='1')//注意g[][] 是 char型的
{
d[i][j]=0;//从1开始向外找
q.push({i,j});//多源BFS的意思 就是有多个点去找 那么类比于单源 就将其都入队即可
}
}
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int nx=dx[i]+t.first;
int ny=dy[i]+t.second;
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(d[nx][ny]!=-1) continue;
d[nx][ny]=d[t.first][t.second]+1;
q.push({nx,ny});
}
}
}
int main()
{
cin>>n>>m;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
cin>>g[i][j];//因为本题输入没有空格 因此只能用char去读入
bfs();
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
cout<<d[i][j]<<" ";
}
cout<<endl;
}
return 0;
}