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