classSolution {
public:
int m, n;
int count = 0;
intnumIslands(vector<vector<char>>& grid){
if (grid.empty()) return0;
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') {
dfs(grid, i, j);
count++;
}
}
}
return count;
}
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
voiddfs(vector<vector<char>>& grid, int i, int j){
// 将访问过的陆地标记为水,防止重复访问
grid[i][j] = '0';
for (int k = 0; k < 4; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1') {
dfs(grid, x, y);
}
}
}
};
classSolution {
public:
int m, n;
int maxArea = 0;
int currentArea = 0;
bool vis[51][51];
intmaxAreaOfIsland(vector<vector<int>>& grid){
if (grid.empty()) return0;
m = grid.size();
n = grid[0].size();
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j] && grid[i][j] == 1) {
currentArea = 0;
dfs(grid, i, j);
maxArea = max(maxArea, currentArea);
}
}
}
return maxArea;
}
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
voiddfs(vector<vector<int>>& grid, int i, int j){
vis[i][j] = true;
currentArea++;
for (int k = 0; k < 4; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1) {
dfs(grid, x, y);
}
}
}
};
classSolution {
public:
int m, n;
voidsolve(vector<vector<char>>& board){
if (board.empty()) return;
m = board.size();
n = board[0].size();
// 1. 从四条边界的 'O' 开始 DFS,标记所有连通的 'O'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);
}
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);
}
// 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';
elseif (board[i][j] == 'O') board[i][j] = 'X';
}
}
}
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
voiddfs(vector<vector<char>>& board, int i, int j){
board[i][j] = '.';
for (int k = 0; k < 4; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {
dfs(board, x, y);
}
}
}
};
classSolution {
public:
int m, n;
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
vector<vector<int>> ret;
if (heights.empty()) return ret;
m = heights.size();
n = heights[0].size();
vector<vector<bool>> pac(m, vector<bool>(n, false));
vector<vector<bool>> atl(m, vector<bool>(n, false));
// 从太平洋边界(左、上)和大西洋边界(右、下)开始 DFSfor (int j = 0; j < n; j++) {
dfs(heights, 0, j, pac);
dfs(heights, m - 1, j, atl);
}
for (int i = 0; i < m; i++) {
dfs(heights, i, 0, pac);
dfs(heights, i, n - 1, 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;
}
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
voiddfs(vector<vector<int>>& heights, int i, int j, vector<vector<bool>>& ocean){
ocean[i][j] = true;
for (int k = 0; k < 4; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
// 反向搜索:只能从低处流向高处(即当前点 <= 邻居点)if (x >= 0 && x < m && y >= 0 && y < n &&
heights[i][j] <= heights[x][y] && !ocean[x][y]) {
dfs(heights, x, y, ocean);
}
}
}
};
classSolution {
public:
int m, n;
int dx[8] = {-1, 1, 0, 0, 1, 1, -1, -1};
int dy[8] = {0, 0, -1, 1, 1, -1, 1, -1};
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
m = board.size();
n = board[0].size();
int x = click[0], y = click[1];
if (board[x][y] == 'M') {
board[x][y] = 'X';
return board;
}
dfs(board, x, y);
return board;
}
voiddfs(vector<vector<char>>& board, int i, int j){
int count = 0;
// 统计周围地雷数for (int k = 0; k < 8; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M') {
count++;
}
}
if (count > 0) {
board[i][j] = count + '0';
} else {
board[i][j] = 'B';
for (int k = 0; k < 8; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E') {
dfs(board, x, y);
}
}
}
}
};
classSolution {
public:
int m, n;
int count = 0;
bool vis[101][101];
intwardrobeFinishing(int _m, int _n, int cnt){
m = _m;
n = _n;
dfs(0, 0, cnt);
return count;
}
int dx[2] = {1, 0};
int dy[2] = {0, 1};
voiddfs(int i, int j, int cnt){
for (int k = 0; k < 2; k++) {
int x = dx[k] + i;
int y = dy[k] + j;
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y]) {
if (digitSum(x) + digitSum(y) <= cnt) {
count++;
vis[x][y] = true;
dfs(x, y, cnt);
}
}
}
}
intdigitSum(int n){
int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
return sum;
}
};