[BZOJ2252]矩阵距离(BFS)

题意

输入矩阵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\n",dis[i][j]);
            }
            else{
                printf("%d ",dis[i][j]);
            }
        }
    }
    
    return 0;
}

posted on 2019-04-16 09:50  coding_gaga  阅读(206)  评论(0编辑  收藏  举报

导航