首页 > 代码库 > 喵哈哈村的魔法考试 Round #7 (Div.2) B

喵哈哈村的魔法考试 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("\n");66         }67     }68     69     return 0;70 } 

 



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