hihocoder-Weekly236-水路距離

hihocoder-Weekly236-水路距離spa

 

題目1 : 水陸距離

時間限制:10000ms
單點時限:1000ms
內存限制:256MB

描述

給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每個位置,求出它距離最近的水域的距離是多少。  code

矩陣中每一個位置與它上下左右相鄰的格子距離爲1。blog

輸入

第一行包含兩個整數,N和M。內存

如下N行每行M個0或者1,表明地圖。string

數據保證至少有1塊水域。it

對於30%的數據,1 <= N, M <= 100  io

對於100%的數據,1 <= N, M <= 800class

輸出

輸出N行,每行M個空格分隔的整數。每一個整數表示該位置距離最近的水域的距離。im

樣例輸入
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\n", ans[i][j]);
                }
            }
        }
    }
    return 0; 
} 
相關文章
相關標籤/搜索