以每一个1为起点向外搜索,不断更新最近距离,如果不能更新则剪枝,不然会超时
`#include
int n,m;
char a;
int m1[4]={-1,1,0,0},m2[4]={0,0,-1,1};
struct q1{
int i,j;
int d=0;
} q_bai[2000007];
int tail_b=0;
void solve2(){
int lst[n][m],flag[n][m];
for(int i=0;i<n;i++){
getchar();
for(int j=0;j<m;j++){
flag[i][j]=-1;
scanf("%c",&a);
if(a'1'){
lst[i][j]=0;
q_bai[tail_b].i=i;
q_bai[tail_b].j=j;
tail_b++;
}
else lst[i][j]=40000;
}
}
struct q1 que[100007];
for(int i=0;i<tail_b;i++){
que[0]=q_bai[i];
int head=0,tail=1;
flag[que[head].i][que[head].j]=0;
while(head<tail){
int x=que[head].i,y=que[head].j;
for(int j=0;j<4;j++){
int n_x=x+m1[j],n_y=y+m2[j];
if(n_x>=0&&n_x<n&&n_y>=0&&n_y<m&&
flag[n_x][n_y]<i&&que[head].d+1<lst[n_x][n_y]){
lst[n_x][n_y]=que[head].d+1;
flag[n_x][n_y]=i;
que[tail].i=n_x;
que[tail].j=n_y;
que[tail].d=que[head].d+1;
tail++;
}
}
head++;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d",lst[i][j]);
if(jm-1) printf("\n");
else printf(" ");
}
}
return;
}
int main(){
scanf("%d %d",&n,&m);
solve2();
return 0;
} `