zoukankan      html  css  js  c++  java
  • 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; 
    } 
    

      

  • 相关阅读:
    Laravel中Contracts的理解和使用
    laravel 服务容器的用法
    linux 安装go环境
    权限设计-系统登录用户权限设计
    Laravel 中使用 JWT 认证的 Restful API
    使用laravel-wechat微信支付
    composer查看全局配置
    如何在 Laravel 项目中处理 Excel 文件
    laravel各种请求类
    Centos创建用户并授权
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/10259213.html
Copyright © 2011-2022 走看看