题目描述

解题思路
多源BFS 参考:https://www.acwing.com/solution/content/40236/
代码
cpp
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int n, m, dist[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
char g[N][N];
void bfs()
{
queue<PII>q;
memset(dist, -1, sizeof dist);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (g[i][j] == '1') // 先将是1的坐标全部加入队列
{
dist[i][j] = 0;
q.push({i, j});
}
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m) continue;
if (dist[a][b] != -1) continue;
q.push({a, b});
dist[a][b] = dist[t.x][t.y] + 1;
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%s", g[i]);
bfs();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
printf("%d ", dist[i][j]);
printf("\n");
}
return 0;
}
