hihocoder-Weekly236-水路距离spa
给定一个N x M的01矩阵,其中1表示陆地,0表示水域。对于每个位置,求出它距离最近的水域的距离是多少。 code
矩阵中每一个位置与它上下左右相邻的格子距离为1。blog
第一行包含两个整数,N和M。内存
如下N行每行M个0或者1,表明地图。string
数据保证至少有1块水域。it
对于30%的数据,1 <= N, M <= 100 io
对于100%的数据,1 <= N, M <= 800class
输出N行,每行M个空格分隔的整数。每一个整数表示该位置距离最近的水域的距离。im
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\n", ans[i][j]); } } } } return 0; }