hihocoder-Weekly236-水路距离

hihocoder-Weekly236-水路距离

题目1 : 水陆距离

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个N x M的01矩阵,其中1表示陆地,0表示水域。对于每一个位置,求出它距离最近的水域的距离是多少。  

矩阵中每个位置与它上下左右相邻的格子距离为1。

输入

第一行包含两个整数,N和M。

以下N行每行M个0或者1,代表地图。

数据保证至少有1块水域。

对于30%的数据,1 <= N, M <= 100  

对于100%的数据,1 <= N, M <= 800

输出

输出N行,每行M个空格分隔的整数。每个整数表示该位置距离最近的水域的距离。

样例输入
4 4  
0110  
1111  
1111  
0110
样例输出
0 1 1 0  
1 2 2 1  
1 2 2 1  
0 1 1 0

典型的bfs,题目中还给出了提示,至少存在着一个水域

#include <cstdio>  
#include <cstring> 
const int MAXN = 800 + 10; 
const int dx[4] = {0, 0, 1, -1}; 
const int dy[4] = {1, -1, 0, 0}; 

int n, m;
char mp[MAXN][MAXN]; 
int ans[MAXN][MAXN], vis[MAXN][MAXN]; 
int q[MAXN*MAXN], dist[MAXN*MAXN]; 

bool Judge(int x, int y)
{
    if(x < 0 || y < 0 || x >= n || y >= m)
        return false; 
    if(vis[x][y] == 1 || mp[x][y] == '0')
        return false; 
    return true; 
}


int main(){ 
    //freopen("in.txt", "r", stdin); 

    while(scanf("%d %d", &n, &m) != EOF)
    {
        for(int i=0; i<n; ++i)
        {
            scanf("%s", mp[i]); 
        }
        int head = 0, tail = 0; 
        memset(vis, 0, sizeof(vis)); 

        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<m; ++j)
            {
                if(mp[i][j] == '0'){
                    q[head] = i * MAXN + j; 
                    dist[head++] = 0; 
                    ans[i][j] = 0; 
                    vis[i][j] = 1; 
                }
            }
        }

        while(head > tail)
        {
            int q_t = q[tail]; 
            int dist_t = dist[tail++]; 
            int cx = q_t / MAXN, cy = q_t % MAXN; 
            for(int i=0; i<4; ++i)
            {
                int nx = cx + dx[i]; 
                int ny = cy + dy[i]; 
                if(Judge(nx, ny))
                {
                    q[head] = nx * MAXN + ny; 
                    dist[head++] = dist_t + 1; 
                    ans[nx][ny] = dist_t + 1; 
                    vis[nx][ny] = 1; 
                }
            }
        }

        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<m; ++j)
            {
                if(j != m-1){
                    printf("%d ", ans[i][j]);
                }else{
                    printf("%d
", ans[i][j]);
                }
            }
        }
    }
    return 0; 
} 

  

原文地址:https://www.cnblogs.com/zhang-yd/p/10259213.html