目录
一:被围绕的区域
1.1题目

题目链接:https://leetcode.cn/problems/surrounded-regions/
1.2算法原理

1.3代码
cpp
class Solution {
public:
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
int m = 0, n =0;
void solve(vector<vector<char>>& board)
{
m = board.size(),n = board[0].size();
//1.把包含边界'O'的区域全部替换为字符'.'
for(int i = 0; i < m;i++)
{
if(board[i][0] == 'O') dfs(board,i,0);
if(board[i][n-1] == 'O') dfs(board,i,n-1);
}
for(int j = 0; j < n;j++)
{
if(board[0][j] == 'O') dfs(board,0,j);
if(board[m-1][j] == 'O') dfs(board,m-1,j);
}
//2.把'.'换成'O','O'换成'X'
for(int i = 0; i < m; i++)
for(int j = 0;j < n; j++)
{
if(board[i][j] == '.') board[i][j] = 'O';
else if(board[i][j] == 'O') board[i][j] = 'X';
}
}
void dfs(vector<vector<char>>& board,int i, int j)
{
board[i][j] = '.';
for(int k = 0; k <4;k++)
{
int x = i + dx[k],y = j + dy[k];
if(x >= 0 && x < m && y >=0 && y <n && board[x][y] == 'O')
{
dfs(board,x,y);
}
}
}
};
二:太平洋大西洋水流问题
2.1题目

题目链接:https://leetcode.cn/problems/pacific-atlantic-water-flow/description/
2.2算法原理

2.3代码
cpp
class Solution {
public:
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
int m = 0, n =0;
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights)
{
m = heights.size(),n = heights[0].size();
vector<vector<int>> ret;
vector<vector<bool>> pac(m,vector<bool>(n));
vector<vector<bool>> atl(m,vector<bool>(n));
//处理太平洋
for(int i = 0; i < m;i++) dfs(heights,i,0,pac);
for(int j = 0; j < n;j++) dfs(heights,0,j,pac);
//处理大西洋
for(int i = 0; i < m;i++) dfs(heights,i,n-1,atl);
for(int j = 0; j < n;j++) dfs(heights,m-1,j,atl);
for(int i = 0; i < m; i++)
for(int j = 0; j < n;j++)
if(pac[i][j] && atl[i][j])
ret.push_back({i,j});
return ret;
}
void dfs(vector<vector<int>>& heights,int i, int j,vector<vector<bool>>& vis)
{
vis[i][j] = true;
for(int k = 0; k <4;k++)
{
int x = i + dx[k],y = j + dy[k];
if(x >= 0 && x < m && y >=0 && y <n && !vis[x][y] &&(heights[x][y] >= heights[i][j]))
{
dfs(heights,x,y,vis);
}
}
}
};
三:扫雷游戏
3.1题目

题目链接:https://leetcode.cn/problems/minesweeper/description/
3.2算法原理

3.3代码
cpp
class Solution {
public:
int dx[8] = {0,0,-1,1,-1,-1,1,1};
int dy[8] = {-1,1,0,0,-1,1,-1,1};
int m,n;
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
{
m = board.size(),n = board[0].size();
//点击到地雷
if(board[click[0]][click[1]] == 'M')
{
board[click[0]][click[1]] = 'X';
return board;
}
dfs(board,click[0],click[1]);
return board;
}
void dfs(vector<vector<char>>& board, int i, int j)
{
//周围有几个地雷
int cont = 0;
for(int k = 0; k <8; k++)
{
int x = i + dx[k], y = j+dy[k];
if(x >= 0 && x< m&& y >=0 && y < n && board[x][y] == 'M')
cont++;
}
//没有地雷,将周围展开
if(cont == 0)
{
board[i][j] = 'B';
for(int k = 0; k <8; k++)
{
int x = i + dx[k], y = j+dy[k];
if(x >= 0 && x< m&& y >=0 && y < n && board[x][y] == 'E')
dfs(board,x,y);
}
}
else//有地雷,显示地雷个数,不再展开四周
{
board[i][j] = cont + '0';
}
}
};
四:衣橱整理
4.1题目

题目链接:https://leetcode.cn/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
4.2算法原理

4.3代码
cpp
class Solution {
public:
int ret = 0;
int dx[2] = {0,1};
int dy[2] = {1,0};
int m ,n;
vector<vector<bool>> vis;
int digit(int num)
{
int sum = 0;
while(num)
{
sum += num%10;
num /= 10;
}
return sum;
}
int wardrobeFinishing(int _m, int _n, int cnt)
{
m = _m, n = _n;
vis = vector<vector<bool>>(m,vector<bool>(n));
dfs(0,0,cnt);
return ret;
}
void dfs(int i, int j,int cnt)
{
vis[i][j] = true;
ret++;
for(int k = 0; k < 2;k++)
{
int x = i +dx[k],y = j + dy[k];
if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && digit(x)+digit(y)<= cnt)
{
dfs(x,y ,cnt);
}
}
}
};