当前位置:   article > 正文

C++ | 用DFS和BFS实现联通块问题——可解最短路径

联通块

什么是联通块

对于蓝色的小块而言,四联通块(题目不说一般都是四联通)就是周围红色的区域,是可到达的位置八联通块是加上黄色的位置

用dfs实现联通块模版

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 110;
  4. int n, m, a[maxn][maxn];
  5. int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
  6. bool vis[maxn][maxn];
  7. void dfs(int x, int y) {
  8. if (x < 1 || y < 1 || x > n || y > n)
  9. return ;
  10. if (vis[x][y])
  11. return ;
  12. vis[x][y] = 1;
  13. for (int i = 0; i < 4; i ++) {
  14. int nx = x + dx[i], ny = y + dy[i];
  15. dfs(nx, ny);
  16. }
  17. }
  18. int main() {
  19. cin >> n >> m;
  20. for (int i = 1; i <= n; i ++)
  21. for (int j = 1; j <= m; j ++)
  22. cin >> a[i][j];
  23. int cnt = 0;
  24. for (int i = 1; i <= n; i ++)
  25. for (int j = 1; j <= m; j ++)
  26. if (!vis[i][j])
  27. cnt ++, dfs(i, j);
  28. cout << cnt;
  29. return 0;
  30. }

用bfs实现联通块模版

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 110;
  4. int n, m, a[maxn][maxn];
  5. int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
  6. bool vis[maxn][maxn];
  7. struct node {
  8. int x, y;
  9. };
  10. void bfs(int x, int y) {
  11. queue<node> q;
  12. q.push((node) {
  13. x, y
  14. }) ;
  15. while (!q.empty()) {
  16. node t = q.front();
  17. q.pop();
  18. if (t.x < 1 || t.x > n || t.y > m || t.y < 1)
  19. continue;
  20. if (vis[t.x][t.y])
  21. continue;
  22. vis[t.x][t.y] = 1;
  23. for (int i = 0; i <= 4; i ++) {
  24. int nx = t.x + dx[i], ny = t.y + dy[i];
  25. q.push((node) {
  26. nx, ny
  27. });
  28. }
  29. }
  30. }
  31. int main() {
  32. cin >> n >> m;
  33. for (int i = 1; i <= n; i ++)
  34. for (int j = 1; j <= m; j ++)
  35. cin >> a[i][j];
  36. int cnt = 0;
  37. for (int i = 1; i <= n; i ++)
  38. for (int j = 1; j <= m; j ++)
  39. if (!vis[i][j])
  40. cnt ++, bfs(i, j);
  41. cout << cnt;
  42. return 0;
  43. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号