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; }