这是一道裸的广搜题吧……
可能是《算法竞赛进阶指南》最水的一道题了……
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 queue<int> qx; 7 queue<int> qy; 8 int n,m,dis[1010][1010],a[1010][1010]; 9 int fx[4]={1,-1,0,0}; 10 int fy[4]={0,0,1,-1}; 11 int main() { 12 cin>>n>>m; 13 for(int i=1;i<=n;i++) 14 for(int j=1;j<=m;j++) 15 scanf("%1d",&a[i][j]); 16 memset(dis,-1,sizeof(dis)); 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=m;j++) 19 if(a[i][j]) { 20 qx.push(i); 21 qy.push(j); 22 dis[i][j]=0; 23 } 24 while(!qx.empty()) { 25 int nowx=qx.front(); 26 int nowy=qy.front(); 27 qx.pop(); 28 qy.pop(); 29 for(int i=0;i<4;i++) { 30 int xx=nowx+fx[i]; 31 int yy=nowy+fy[i]; 32 if(xx<1||xx>n||yy<1||yy>m) continue ; 33 if(dis[xx][yy]==-1) { 34 dis[xx][yy]=dis[nowx][nowy]+1; 35 qx.push(xx); 36 qy.push(yy); 37 } 38 } 39 } 40 for(int i=1;i<=n;i++) { 41 for(int j=1;j<=m;j++) 42 cout<<dis[i][j]<<" "; 43 cout<<endl; 44 } 45 return 0; 46 }