class Solution {
public:
int m, n;
int sour;
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc,int color) {
m = image.size();
n = image[0].size();
sour = image[sr][sc];
if(sour==color){
return image;
}
dfs(image, sr, sc, color);
return image;
}
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void dfs(vector<vector<int>>& image, int i, int j, int color) {
image[i][j] = color;
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 && image[x][y] == sour) {
dfs(image, x, y, color);
}
}
}
};
class Solution {
public:
int ret;
int m, n;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int numIslands(vector<vector<char>>& 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] - '0' == 1) {
dfs(grid, i, j);
ret++;
}
}
}
return ret;
}
void dfs(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] - '0' == 1) {
dfs(grid, x, y);
}
}
}
};
class Solution {
public:
int path;
int ret;
int m, n;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
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) {
path=1;
dfs(grid, i, j);
}
}
}
return ret;
}
void dfs(vector<vector<int>>& grid, int i, int j) {
grid[i][j]=0;
if (path > ret) {
ret = path;
}
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) {
path++;
dfs(grid, x, y);
}
}
}
};
class Solution {
public:
int m, n;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool check[200][200];
void solve(vector<vector<char>>& board) {
m = board.size();
n = board[0].size();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'O') {
check[i][j]=true;
if(dfs(board, i, j)){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(check[i][j]){
board[i][j]='X';
}
}
}
}
check[i][j]=false;
}
}
}
}
bool dfs(vector<vector<char>>& board, int i, int j) {
if(i==0||i==m-1||j==0||j==n-1){
return false;
}
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 &&!check[x][y]&& board[x][y] == 'O') {
check[x][y]=true;
if(dfs(board, x, y)==false){
check[x][y]=false;
return false;
}
check[x][y]=false;
}
}
return true;
}
};
正难则反:我们先去处理边界情况,把边界的进行深度优先遍历
第一种用bool数组标记为已经使用过即可
第二种修改成特殊字符,然后在对非边界进行深度优先修改成X,最后把特殊字符改为O即可
cpp复制代码
class Solution {
public:
int m, n;
bool vis[200][200];
void solve(vector<vector<char>>& board) {
m = board.size();
n = board[0].size();
for (int i = 0; i < m; i++) {
if (board[i][0] == 'O' && !vis[i][0]) {
dfs(board, i, 0);
}
}
for (int j = 0; j < n; j++) {
if (board[0][j] == 'O' && !vis[0][j]) {
dfs(board, 0, j);
}
}
for (int i = 0; i < m; i++) {
if (board[i][n - 1] == 'O' && !vis[i][n - 1]) {
dfs(board, i, n - 1);
}
}
for (int j = 0; j < n; j++) {
if (board[m - 1][j] == 'O' && !vis[m - 1][j]) {
dfs(board, m - 1, j);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j] && board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void dfs(vector<vector<char>>& board, int i, int j) {
vis[i][j] = true;
for (int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O' &&
!vis[x][y]) {
dfs(board, x, y);
}
}
}
};
class Solution {
public:
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int m, n;
bool pacific[200][200];
bool atlantic[200][200];
vector<vector<int>> ret;
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
m = heights.size();
n = heights[0].size();
for (int i = 0; i < m; i++) {
if (!pacific[i][0]) {
pacific[i][0] = true;
dfs1(heights, i, 0);
}
}
for (int j = 0; j < n; j++) {
if (!pacific[0][j]) {
pacific[0][j] = true;
dfs1(heights, 0, j);
}
}
for (int i = 0; i < m; i++) {
if (!atlantic[i][n - 1]) {
atlantic[i][n - 1] = true;
dfs2(heights, i, n - 1);
}
}
for (int j = 0; j < n; j++) {
if (!atlantic[m - 1][j]) {
atlantic[m - 1][j] = true;
dfs2(heights, m - 1, j);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (atlantic[i][j] && pacific[i][j]) {
ret.push_back({i, j});
}
}
}
return ret;
}
void dfs1(vector<vector<int>>& heights, int i, int 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 &&
heights[x][y] >= heights[i][j] && !pacific[x][y]) {
pacific[x][y] = true;
dfs1(heights, x, y);
}
}
}
void dfs2(vector<vector<int>>& heights, int i, int 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 &&
heights[x][y] >= heights[i][j] && !atlantic[x][y]) {
atlantic[x][y] = true;
dfs2(heights, x, y);
}
}
}
};
class Solution {
public:
int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[8] = {-1, 1, -1, 1, 0, -1, 1, 0};
int m,n;
vector<vector<char>> updateBoard(vector<vector<char>>& board,vector<int>& click) {
m=board.size();
n=board[0].size();
dfs(board, click[0], click[1]);
return board;
}
void dfs(vector<vector<char>>& board, int i, int j) {
if(board[i][j]=='M'){
board[i][j]='X';
return ;
}
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) {
if (board[x][y] == 'M') {
count++;
}
}
}
if (count == 0) {
// 说明四周没有地雷
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);
}
}
} else {
board[i][j] = count +'0';
}
}
};