喵哈哈村的魔法考试 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 } 


原文地址:https://www.cnblogs.com/ledoc/p/6556753.html