正在纠结这类水题有没有写题解的必要?
暴露智商了。囧。我智商-∞岂会轻易告诉你们?
把所有1的点放进队列。bfs。没了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mp make_pair
#define qsize 2000000
typedef pair<int,int> pii; pii q[qsize];
int head=0,tail=0,n,m,d[1005][1005]; char s[1005];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int main(){
scanf("%d%d",&n,&m); memset(d,63,sizeof(d));
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++) if(s[j]-'0') q[tail++]=mp(i,j), d[i][j]=0;
}while(head!=tail){
pii u=q[head++]; if(head>=qsize) head-=qsize;
for(int k=0;k<4;k++){
int xx=u.first+dx[k],yy=u.second+dy[k];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&d[u.first][u.second]+1<d[xx][yy]){
d[xx][yy]=d[u.first][u.second]+1;
q[tail++]=mp(xx,yy); if(tail>=qsize) tail-=qsize;
}
}
}for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) printf("%d ",d[i][j]);
printf("\n");
}return 0;
}