130. 被围绕的区域
难度:中等
题目描述
解题思路
这道题的思路有点巧妙( •̀ ω •́ )y
因为边界上的O和它相邻的O一定不会被标记,所以可以用逆向思维,先把所有边界上的O和和它相邻的O都标记出来,最后把标记还原,没标记过的变成X
1、DFS
/*
* 130. 被围绕的区域
* 2020/7/18
*/
public void solve(char[][] board) {
int m = board.length;
int n = board[0].length;
//对边界的O进行DFS
for (int i = 0; i < n;i++) { //上边界
if(board[0][i] == 'O') {
dfsSolveHelper(board,0,i);
}
if(board[m-1][i] == 'O') { //下边界
dfsSolveHelper(board, m-1, i);
}
}
for (int i = 1; i < m-1; i++) {
if(board[i][0] == 'O') { //左边界
dfsSolveHelper(board,i,0);
}
if(board[i][n-1] == 'O') { //右边界
dfsSolveHelper(board, i, n-1);
}
}
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';
}
}
}
//标记所有和边界相邻的点
public void dfsSolveHelper(char[][] board,int i ,int j) {
//如果不满足条件,剪枝
if(i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != 'O') {
return ;
}
board[i][j] = '#';
dfsSolveHelper(board, i+1, j);
dfsSolveHelper(board, i-1, j);
dfsSolveHelper(board, i, j+1);
dfsSolveHelper(board, i, j-1);
return;
}