概念
breadth first search(bfs) 宽度优先搜索。算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。
这块应该先去了解一下图上的遍历的过程,更好理解代码
棋盘问题,Flood Fill,问题状态的表述升级,模型主要特点,最短路/最少步数/最少次数,就是图论最短路问题,边权是1的情况。
根据下面示例代码,学习bfs(),学会使用queue<>。bfs相对是好写的,模板很清晰。
《一本通》题目
【例8.2】细胞
// Flood Fill
// 示例代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e4 + 10;
char s[N][N];
int n, m; //没有给nm范围
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
void bfs(int ux, int uy)
{
queue<PII> q;
q.push(make_pair(ux, uy));
while (!q.empty()){
PII t = q.front(); q.pop();
int x = t.first, y = t.second;
s[x][y] = '0';
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 (s[a][b] == '0') continue;
q.push(make_pair(a, b));
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) scanf("%s", s[i]);
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++){
if (s[i][j] != '0'){
bfs(i, j);
cnt++;
}
}
cout << cnt << '\n';
return 0;
}