多起点问题,把初始为1的点都加入队列即可
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
typedef pair<int,int> P;
int n,m;
char g[N][N];
int dis[N][N];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void bfs(){
memset(dis,-1,sizeof(dis));
queue<P> q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(g[i][j]=='1'){
q.push({i,j});
dis[i][j]=0;
}
}
}
while(!q.empty()){
P t=q.front();
q.pop();
int x=t.first,y=t.second;
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<n&&b>=0&&b<m&&dis[a][b]==-1){
dis[a][b]=dis[x][y]+1;
q.push({a,b});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>g[i];
bfs();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<dis[i][j]<<' ';
}
puts("");
}
return 0;
}