题意
输入矩阵m行n列(m<=500,n<=500),只含0、1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l)。
示例:
输入:
3 4
0 0 0 1
0 0 1 1
0 1 1 0
输出:
3 2 1 0
2 1 0 0
1 0 0 1
解体思路
把所有1点入队,然后BFS。这样每个点只遍历一遍。
题解
#include <stdio.h>
#include <queue>
using namespace std;
int m,n;
int a[505][505];
queue<pair<int, int>> pointQ;
int dis[505][505];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
bool bound(int x,int y){
return x>=0&&y>=0&&x<=m&&y<=n;
}
void bfs(){
while(!pointQ.empty()){
pair<int,int> point=pointQ.front();
pointQ.pop();
int x=point.first;
int y=point.second;
for(int i=0;i<4;++i){
int xx=x+dx[i];
int yy=y+dy[i];
if(bound(xx, yy)&&dis[xx][yy]==-1){
dis[xx][yy]=dis[x][y]+1;
pointQ.push(make_pair(xx, yy));
}
}
}
}
int main(int argc, const char * argv[]) {
memset(dis, -1, sizeof(dis));
scanf("%d %d",&m,&n);
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
scanf("%d",&a[i][j]);
if(a[i][j]==1){
pointQ.push(make_pair(i, j));
dis[i][j]=0;
}
}
}
bfs();
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(j==n-1){
printf("%d
",dis[i][j]);
}
else{
printf("%d ",dis[i][j]);
}
}
}
return 0;
}