当前位置:   article > 正文

BFS FloodFill算法

BFS FloodFill算法

目录

1、 733. 图像渲染

2、 200. 岛屿数量

3、 695. 岛屿的最大面积

4、 130. 被围绕的区域


1、 733. 图像渲染

思路:广度优先搜索一层一层扫描,从上下左右四个方向扫描,直接修改值即可。

  1. class Solution {
  2. public:
  3. typedef pair<int, int> P;
  4. int dx[4] = {1,-1,0,0,};
  5. int dy[4] = {0, 0, -1, 1};
  6. vector<vector<int>> floodFill(vector<vector<int>>& image,
  7. int sr, int sc, int color) {
  8. int prev = image[sr][sc];
  9. if (prev == color) {
  10. return image;
  11. }
  12. int m = image.size(), n = image[0].size();
  13. queue<P> q;
  14. q.push(P{sr, sc});
  15. while (!q.empty()) {
  16. auto a = q.front();
  17. image[a.first][a.second] = color;
  18. q.pop();
  19. for (int i = 0; i < 4; i++) {
  20. int x = dx[i] + a.first, y = dy[i] + a.second;
  21. if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev) {
  22. q.push(P{x, y});
  23. }
  24. }
  25. }
  26. return image;
  27. }
  28. };

2、 200. 岛屿数量

 思路:遍历数组每个元素,遇到“1“则岛屿数量加一,然后使用广度优先搜索一层一层扫描,从上下左右四个方向扫描,需要借助一个数组标识当前岛屿的位置,以避免重复统计。

C11支持:

 auto [a, b] 是 C++11 引入的结构化绑定(Structured Binding)语法,它允许你一次性声明多个变量,并且这些变量会自动与某个结构体、元组或者其他聚合类型(包括std::pair)的成员对应起来。在这个上下文中,auto [a, b] 就是用来直接解构 queue.front() 返回的 std::pair<int, int> 类型元素,其中 a 和 b 会分别绑定到 pair 中的第一和第二个元素。

  1. class Solution {
  2. public:
  3. int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
  4. int m, n;
  5. vector<vector<bool>> vis;
  6. int numIslands(vector<vector<char>>& grid) {
  7. int ret = 0;
  8. m = grid.size(), n = grid[0].size();
  9. vis.resize(m, vector<bool>(n, false));
  10. for (int i = 0; i < m; i++) {
  11. for (int j = 0; j < n; j++) {
  12. if (grid[i][j] == '1' && vis[i][j] == false) {
  13. ret++;
  14. bfs(grid, i, j);
  15. }
  16. }
  17. }
  18. return ret;
  19. }
  20. void bfs(vector<vector<char>>& grid, int i, int j) {
  21. queue<pair<int, int>> q;
  22. q.push({i, j});
  23. vis[i][j] = true;
  24. while (!q.empty()) {
  25. auto [a, b] = q.front();
  26. q.pop();
  27. for (int k = 0; k < 4; k++) {
  28. int x = a + dx[k], y = b + dy[k];
  29. if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' &&
  30. vis[x][y] == false) {
  31. q.push({x, y});
  32. vis[x][y] = true;
  33. }
  34. }
  35. }
  36. }
  37. };

 C98支持:

  1. class Solution {
  2. public:
  3. vector<vector<bool>> vis;
  4. int m, n;
  5. int numIslands(vector<vector<char>>& grid) {
  6. m = grid.size(), n = grid[0].size();
  7. int ret = 0;
  8. vis.resize(m, vector<bool>(n, false));
  9. for (int i = 0; i < m; i++) {
  10. for (int j = 0; j < n; j++) {
  11. if (grid[i][j] == '1' && !vis[i][j]) {
  12. ret++;
  13. bfs(grid, i, j);
  14. }
  15. }
  16. }
  17. return ret;
  18. }
  19. int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, -1, 1};
  20. void bfs(vector<vector<char>>& grid, int i, int j) {
  21. queue<pair<int, int>> q;
  22. q.push(make_pair(i, j));
  23. vis[i][j] = true;
  24. while (!q.empty()) {
  25. auto a = q.front();
  26. q.pop();
  27. for (int k = 0; k < 4; k++) {
  28. int x = a.first + dx[k], y = a.second + dy[k];
  29. if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' &&
  30. !vis[x][y]) {
  31. q.push(make_pair(x, y));
  32. vis[x][y] = true;
  33. }
  34. }
  35. }
  36. }
  37. };

3、 695. 岛屿的最大面积

思路:遍历数组每个元素,在每个元素的BFS中统计岛屿面积,BFS结束返回当前岛屿的面积,再与上次的岛屿面积相比取最大值。

  1. class Solution {
  2. public:
  3. vector<vector<bool>> vis;
  4. int m, n;
  5. int maxAreaOfIsland(vector<vector<int>>& grid) {
  6. m = grid.size(), n = grid[0].size();
  7. int ret = 0;
  8. vis.resize(m, vector<bool>(n, false));
  9. for (int i = 0; i < m; i++) {
  10. for (int j = 0; j < n; j++) {
  11. if (grid[i][j] == 1 && !vis[i][j]) {
  12. ret = max(ret, bfs(grid, i, j));
  13. }
  14. }
  15. }
  16. return ret;
  17. }
  18. int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, -1, 1};
  19. int bfs(vector<vector<int>>& grid, int i, int j) {
  20. int count = 0;
  21. queue<pair<int, int>> q;
  22. q.push(make_pair(i, j));
  23. vis[i][j] = true;
  24. count++;
  25. while (!q.empty()) {
  26. auto [a, b] = q.front();
  27. q.pop();
  28. for (int k = 0; k < 4; k++) {
  29. int x = a + dx[k], y = b + dy[k];
  30. if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 &&
  31. !vis[x][y]) {
  32. count++;
  33. q.push({x, y});
  34. vis[x][y] = true;
  35. }
  36. }
  37. }
  38. return count;
  39. }
  40. };

4、 130. 被围绕的区域

思路:与边界处的“O”相邻的不能算被围绕的区域,所以先BFS位于边界的“O”,将它们暂时换成一个其他字符比如“.”,处理完边界的“O”,遍历数组如果为“O”则改成“X”,为“.”改成O,这样既保护住了边界的“O”,有修改了被包围的“O”为“X”。

  1. class Solution {
  2. public:
  3. int m, n;
  4. void solve(vector<vector<char>>& board) {
  5. m = board.size(), n = board[0].size();
  6. for (int i = 0; i < m; i++) {
  7. if (board[i][0] == 'O')
  8. bfs(board, i, 0);
  9. if (board[i][n - 1] == 'O')
  10. bfs(board, i, n - 1);
  11. }
  12. for (int j = 0; j < n; j++) {
  13. if (board[0][j] == 'O')
  14. bfs(board, 0, j);
  15. if (board[m - 1][j] == 'O')
  16. bfs(board, m - 1, j);
  17. }
  18. for (int i = 0; i < m; i++) {
  19. for (int j = 0; j < n; j++) {
  20. if (board[i][j] == '.')
  21. board[i][j] = 'O';
  22. else if (board[i][j] == 'O')
  23. board[i][j] = 'X';
  24. }
  25. }
  26. }
  27. int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
  28. void bfs(vector<vector<char>>& board, int i, int j) {
  29. queue<pair<int, int>> q;
  30. q.push({i, j});
  31. board[i][j] = '.';
  32. while (!q.empty()) {
  33. auto [a, b] = q.front();
  34. q.pop();
  35. for (int k = 0; k < 4; k++) {
  36. int x = a + dx[k], y = b + dy[k];
  37. if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {
  38. q.push({x, y});
  39. board[x][y] = '.';
  40. }
  41. }
  42. }
  43. }
  44. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/620705
推荐阅读
相关标签
  

闽ICP备14008679号