Given a 2D board containing 'X'
and 'O'
(the letter O), capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
Example:
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
Explanation:
Surrounded regions shouldn’t be on the border, which means that any 'O'
on the border of the board are not flipped to 'X'
. Any 'O'
that is not on the border and it is not connected to an 'O'
on the border will be flipped to 'X'
. Two cells are connected if they are adjacent cells connected horizontally or vertically.
该方法类似于围棋,找出被包围的所有O,将其置换为X,以相反思路可以为找出未被包围的O,将其不变,其他改为X。
class Solution {
public void solve(char[][] board) {
if(board == null || board.length ==0) {
return ;
}
for(int i=0;i<board.length;i++) {
dfs(i,0,board);
dfs(i,board[i].length-1,board);
}
for(int i=0;i<board[0].length;i++) {
dfs(0,i,board);
dfs(board.length-1,i,board);
}
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[i].length;j++) {
board[i][j] = (board[i][j] == 'V'?'O':'X');
}
}
}
public void dfs(int i,int j,char[][] board) {
if(i<0 || i >= board.length || j<0 || j >= board[i].length) {
return;
}
if(board[i][j] == 'O'){
board[i][j] = 'V';
}else {
return;
}
dfs(i+1,j,board);
dfs(i-1,j,board);
dfs(i,j+1,board);
dfs(i,j-1,board);
}
}