#295. 「BJWC2010」矩阵距离
题意
图中0到1的最短距离。
样例输入
3 4
0001
0011
0110
样例输出
3 2 1 0
2 1 0 0
1 0 0 1
C++
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
int mp[1001][1001],ans[1001][1001],f[1001][1001];
char c[1000001];
int n,m;
int dx[4]= {-1,1,0,0};
int dy[4]= {0,0,1,-1};
queue<PII> d;
inline int read(){
char ch=getchar();
int f=1,x=0;
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}//快读
inline void work(int k){
if(k<0){
putchar('-');
k=-k;
}
if(k>9)
work(k/10);
putchar(k%10+'0');
}
bool bj(int ex,int ey) {
return ex>=1&&ey>=1&&ex<=n&&ey<=m;
}//边界
void bfs() {
while(!d.empty()) {
int x=d.front().first;
int y=d.front().second;
d.pop();
for(int i=0; i<4; i++) {
int xx=x+dx[i];
int yy=y+dy[i];
if(bj(xx,yy)&&!f[xx][yy]) {
d.push(make_pair(xx,yy));
ans[xx][yy]=ans[x][y]+1;
f[xx][yy]=1;
}
}
}
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
mp[i][j]=getchar()-'0';
if(mp[i][j]){
d.push(make_pair(i,j));
f[i][j]=1;//标记
}
}
getchar();
}
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
work(ans[i][j]);
printf(" ");
}
puts("");
}
return 0;
}