喵哈哈村的魔法考试 Round #7 (Div.2) B
Posted 我是codel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了喵哈哈村的魔法考试 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的主要内容,如果未能解决你的问题,请参考以下文章
喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE
2017-5-16-Train:喵哈哈村的魔法考试 Round #19 (Div.2)