多源BFS
上一章的时候BFS仅仅是预存储一个初始起点,而本章拓展为预存储多个起点。
本题题意比较好理解,下面是样例的图示:
初始阶段将所有1的点存储进队列中,用BFS往外扩散同时计算距离。
代码展示:
#include <iostream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int n, m;
char g[N][N];
int dist[N][N];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
void bfs() {
PII q[N * N];
int hh = 0, tt = -1;
memset(dist, -1, sizeof dist);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '1') {
q[++tt] = {i, j};
dist[i][j] = 0;
}
}
}
while (hh <= tt) {
PII t = q[hh++];
int x = t.x, y = t.y;
for (int i = 0; i < 4; i++) {
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m) continue;
if (dist[a][b] != -1) continue;
dist[a][b] = dist[x][y] + 1;
q[++tt] = {a, b};
}
}
}
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]);
}
puts("");
}
return 0;
}