文章目录
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});
}
}
}
}
};