概念

breadth first search(bfs) 宽度优先搜索。算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。

这块应该先去了解一下图上的遍历的过程,更好理解代码

棋盘问题,Flood Fill,问题状态的表述升级,模型主要特点,最短路/最少步数/最少次数,就是图论最短路问题,边权是1的情况。

根据下面示例代码,学习bfs(),学会使用queue<>。bfs相对是好写的,模板很清晰。

《一本通》题目

【例8.2】细胞
  1. // Flood Fill
  2. // 示例代码
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. typedef pair<int, int> PII;
  6. const int N = 1e4 + 10;
  7. char s[N][N];
  8. int n, m; //没有给nm范围
  9. int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
  10. void bfs(int ux, int uy)
  11. {
  12. queue<PII> q;
  13. q.push(make_pair(ux, uy));
  14. while (!q.empty()){
  15. PII t = q.front(); q.pop();
  16. int x = t.first, y = t.second;
  17. s[x][y] = '0';
  18. for (int i = 0; i < 4; i++){
  19. int a = x + dx[i], b = y + dy[i];
  20. if (a < 0 || a >= n || b < 0 || b >= m) continue;
  21. if (s[a][b] == '0') continue;
  22. q.push(make_pair(a, b));
  23. }
  24. }
  25. }
  26. int main()
  27. {
  28. cin >> n >> m;
  29. for (int i = 0; i < n; i++) scanf("%s", s[i]);
  30. int cnt = 0;
  31. for (int i = 0; i < n; i++)
  32. for (int j = 0; j < m; j++){
  33. if (s[i][j] != '0'){
  34. bfs(i, j);
  35. cnt++;
  36. }
  37. }
  38. cout << cnt << '\n';
  39. return 0;
  40. }