• 喵哈哈村的魔法考试 Round #7 (Div.2) B


     B 喵哈哈村的麦克雷 

    喵哈哈村的麦克雷

    发布时间: 2017年3月13日 11:51   最后更新: 2017年3月14日 18:16   时间限制: 1000ms   内存限制: 128M

    为了拯救喵哈哈村,这个世界必须要存在英雄。

    一名叫做麦克雷的英雄站了出来!他现在面临一个难题:

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

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

    本题包含若干组测试数据:
    第一行包含两个整数,N和M。
    以下N行每行M个0或者1,代表地图。
    数据保证至少有1块水域。
    满足,1 <= N, M <= 100

    输出N行,每行M个空格分隔的整数。每个整数表示该位置距离最近的水域的距离。
    每行的末尾都请加一个空格……

    复制
    4 4  
    0110  
    1111  
    1111  
    0110
    0 1 1 0  
    1 2 2 1  
    1 2 2 1  
    0 1 1 0

    Hint: bfs
    一开始看到这个题目,就想到bfs搜距离嘛...然后就从第一个开始去搜 搜 搜...搜到最后一个点,样例是通过了 然后发现tle了...
    看到题解之后。。。噢原来可以这样做啊...(把0放进队列,然后从0开始搜嘛,每次从同一层次级别开始搜) bfs的特点是层序遍历,所以它搜到的就是最短路(可以用反证法证明一下)

     1 #include<iostream>
     2 #include<queue>
     3 #include<cstdio>
     4 #include<cstring>
     5 using namespace std;
     6 typedef pair<int, int> p;
     7 char g[1000][1000];
     8 int sign[1000][1000];
     9 int dx[]={1, 0, -1, 0}, dy[]={0, 1, 0, -1};
    10 int n, m;
    11 inline bool ok(int x, int y){
    12     if(x>=0&&x<n&&y>=0&&y<m) return true;
    13     return false;
    14 }
    15 /*
    16 inline void bfs(int x, int y){
    17     
    18     que.push(make_pair(x, y));
    19     while(que.size()){
    20         p now=que.front(); que.pop();
    21         for(int i=0; i<4; i++){
    22             int nx=now.first+dx[i], ny=now.second+dy[i];
    23             if(ok(nx, ny))    {
    24                 que.push(make_pair(nx, ny));
    25                 step[nx][ny]=step[now.first][now.second]+1;
    26                 if(g[nx][ny]=='0'){
    27                     sign[x][y]=step[nx][ny];
    28                     sign[now.first][now.second]=1;
    29                     return;
    30                 }    
    31             }    
    32         }
    33     }
    34 }
    35 */
    36 int main(){
    37     while(cin>>n>>m){
    38         for(int i=0; i<n; i++){
    39                 scanf("%s", &g[i]);
    40         }
    41         memset(sign, -1, sizeof(sign));
    42         queue<pair<int, int> >que;
    43         for(int i=0; i<n; i++){
    44             for(int j=0; j<m; j++){
    45                 if(g[i][j]=='0'){
    46                     sign[i][j]=0;
    47                     que.push(make_pair(i, j));
    48                 }
    49             }
    50         }
    51         while(que.size()){
    52             p now=que.front(); que.pop();
    53             for(int i=0; i<4; i++){
    54                 int nx=now.first+dx[i], ny=now.second+dy[i];
    55                 if(!ok(nx, ny))    continue;
    56                 if(sign[nx][ny]!=-1)    continue;
    57                 sign[nx][ny]=sign[now.first][now.second]+1;
    58                 que.push(make_pair(nx, ny));
    59             }
    60         }
    61         for(int i=0; i<n; i++){
    62             for(int j=0; j<m; j++){
    63                 printf("%d ", sign[i][j]);
    64             }
    65             printf("
    ");
    66         }
    67     }
    68     
    69     return 0;
    70 } 


  • 相关阅读:
    区间dp体会
    P1083借教室 noip提高组复赛2012
    P2678跳石头体会 noip2015提高组
    tarjan求LCA的体会
    P1006 传纸条
    P1140 相似基因 详解
    UVA1025 城市里的间谍 A Spy in the Metro 题解
    DAG上的动规嵌套矩形问题(含思考题)
    洛谷P1030c++递归求解先序排列
    Test 2019.7.22
  • 原文地址:https://www.cnblogs.com/ledoc/p/6556753.html
Copyright © 2020-2023  润新知