题目的链接在这里:https://leetcode-cn.com/problems/surrounded-regions/
题目大意
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
一、示意图
二、解题思路
DFS
代码如下:
class Solution {
//思路就是标记边界的0 然后向内搜索标记,最后再把没有标记的0修改为X
int [] direction={-1,0,1,0,-1};
int m,n;
public void solve(char[][] board) {
n=board.length;
if (n==0)
return;
m=board[0].length;
//然后开始 遍历检查左右和上下边界
for(int i=0;i<n;i++){
//左边界
dfs(board,i,0);
//右边界
dfs(board,i,m-1);
}
//再开始遍历 上下边界
for(int i=0;i<m;i++){
//上边界
dfs(board,0,i);
//下边界
dfs(board,n-1,i);
}
//dfs的功能 也就是让和边界相邻的O节点都变成'1' 然后到时候把剩下的0都换成x即可 并且吧'1'换回到'O'
//所以这个时候 边界都变成1了 开始遍历即可
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(board[i][j]=='O'){
board[i][j]='X';
}
else if(board[i][j]=='1'){
board[i][j]='O';
}
}
}
}
private void dfs(char[][] board, int i, int j) {
//开始写这个了
//首先是结束遍历的条件
if(i<0||i>=n||j<0||j>=m||board[i][j]!='O')
return;
//不然的话 就把这个节点设置为'1'
board[i][j]='1';
//然后开始遍历 由于这个return的存在 就不用for循环了
for(int k=0;k<4;k++){
dfs(board,i+direction[k],j+direction[k+1]);
}
/* dfs(board,i-1,j);
dfs(board,i+1,j);
dfs(board,i,j-1);
dfs(board,i,j+1);*/
}
}