hihocoder-Weekly236-水路距离
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\n", ans[i][j]);
}
}
}
}
return 0;
}

浙公网安备 33010602011771号