BZOJ 2252: [2010Beijing wc]矩阵距离
题目
2252: [2010Beijing wc]矩阵距离
Time Limit: 10 Sec Memory Limit: 256 MBDescription
假设我们有矩阵,其元素值非零即1
a11…… a1m
…………….
an1…….anm
定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L)
Input
输入文件的第一行为两个整数,分别代表n和m。
接下来的n行,第i行的第 j个字符代表aij
Output
输出包含N行,每行M个用空格分开的数字,其中第i行第J个数字代表
Min(D(aij,axy) 1<=x<=N 1<=y<m,且axy=1
Sample Input
3 4
0001
0011
0110
0001
0011
0110
Sample Output
3 2 1 0
2 1 0 0
1 0 0 1
2 1 0 0
1 0 0 1
HINT
对于100%的数据,满足 0 < m n <=1000
题解
好吧,就是一个宽搜,而且根据宽搜的性质,所以每个点只需要经过一次就足够了。
代码
1 /*Author:WNJXYK*/ 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 6 int dist[1005][1005]; 7 8 int n,m; 9 int dx[]={0,1,0,-1,0}; 10 int dy[]={0,0,1,0,-1}; 11 inline char read(){ 12 char x; 13 x=getchar(); 14 while(x!='1' && x!='0') x=getchar(); 15 return x; 16 } 17 struct xy{ 18 int x,y; 19 xy(){} 20 xy(int a,int b){ 21 x=a;y=b; 22 } 23 }; 24 queue<xy> que; 25 26 inline void bfs(){ 27 28 while(!que.empty()){ 29 int x=que.front().x,y=que.front().y; 30 que.pop(); 31 for (int k=1;k<=4;k++){ 32 int nx=x+dx[k],ny=y+dy[k]; 33 if (nx<1 || nx>n || ny<1 || ny>m || dist[nx][ny]!=-1) continue; 34 dist[nx][ny]=dist[x][y]+1; 35 que.push(xy(nx,ny)); 36 } 37 } 38 39 } 40 int main(){ 41 scanf("%d%d",&n,&m); 42 for (int i=1;i<=n;i++){ 43 for (int j=1;j<=m;j++){ 44 if (read()=='0') dist[i][j]=-1; else {dist[i][j]=0;que.push(xy(i,j));} 45 } 46 } 47 bfs(); 48 for (int i=1;i<=n;i++){ 49 for (int j=1;j<=m;j++){ 50 printf("%d ",dist[i][j]); 51 } 52 printf("\n"); 53 } 54 return 0; 55 }