【算法专题十四】BFS解决FloodFill算法
文章目录
- 1.简介
- 2.图像渲染
- 2.1 题目
- 2.2 思路
- 2.3代码
- 3.岛屿数量
- 3.1 题目
- 3.2 思路
- 3.3 代码
- 4.岛屿的最大面积
- 4.1 题目
- 4.2 思路
- 4.3 代码
- 5. 被围绕的区域
- 5.1 题目
- 5.2 思路
- 5.3 代码
1.简介
2.图像渲染
2.1 题目
题目链接
2.2 思路
2.3代码
class Solution {
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev = image[sr][sc];if(prev == color) return image; // 判断边界条件queue<pair<int, int>> q;q.push({sr, sc});int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = image.size(), n = image[0].size();while(q.size()){auto [a, b] = q.front();q.pop();image[a][b] = color;for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i]; if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev) q.push({x, y});}} return image;}
};
3.岛屿数量
3.1 题目
题目链接
3.2 思路
3.3 代码
class Solution {
public:bool vis[301][301];int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};int m, n;int numIslands(vector<vector<char>>& grid) {int ret = 0;m = grid.size(), n = grid[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == '1' && !vis[i][j]){ret += 1;bfs(grid, i, j); // 把这块陆地都标记一下;}}} return ret;}void bfs(vector<vector<char>>& grid, int i, int j){queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y]){q.push({x, y});vis[x][y] = true;}}}}
};
4.岛屿的最大面积
4.1 题目
题目链接
4.2 思路
4.3 代码
class Solution {
public:int m, n;bool vis[51][51];int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0}; int ret;int maxAreaOfIsland(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == 1 && !vis[i][j]){int ret2 = bfs(grid, i, j);ret = max(ret, ret2);}}}return ret;}int bfs(vector<vector<int>>& grid, int i, int j){queue<pair<int, int>> q;q.push({i, j});vis[i][j] = true;int ret1=1;while(q.size()){auto [a, b] = q.front();q.pop();for(int ii = 0; ii < 4; ii++){int x = a + dx[ii], y = b + dy[ii];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]){q.push({x, y});ret1 ++;vis[x][y] = true;}}}return ret1;}
};
5. 被围绕的区域
5.1 题目
题目链接
5.2 思路
5.3 代码
class Solution {
public:int m, n;// bool vis[201][201];// 因为这个题可以直接在原数组上修改,所以就不用vis数组了int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};void solve(vector<vector<char>>& board) {m = board.size(), n = board[0].size();// 1.先把边缘的0变成.for(int i = 0; i < m; i++){if(board[i][0] == 'O') bfs(board, i, 0);if(board[i][n - 1] == 'O') bfs(board, i, n - 1);}for(int j = 0; j < n; j++){if(board[0][j] == 'O') bfs(board, 0, j);if(board[m - 1][j] == 'O') bfs(board, m - 1, j);}for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(board[i][j] == 'O') board[i][j] = 'X';if(board[i][j] == '.') board[i][j] = 'O';}}}void bfs(vector<vector<char>>& board, int i, int j){queue<pair<int, int>> q;q.push({i, j});board[i][j] = '.';while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){board[x][y] = '.';q.push({x, y});}}}}
};