Given a 2D board containing 'X'
and 'O'
, capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For 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解法一:DFS,先DFS将和边界连着的O转为D,再遍历将剩下的O转为X
注意:二维的DFS即矩阵的dfs是四个方向
可惜,超时,尼玛
public class Solution {
public void solve(char[][] board) {
if(board == null || board.length == 0) return ;
int row = board.length;
int col = board[0].length;
for(int i=0; i<row; i++){
dfs(board, i, 0);
dfs(board, i, col-1);
}
for(int j=0; j<col; j++){
dfs(board, 0, j);
dfs(board, row-1, j);
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(board[i][j] == 'O') board[i][j] = 'X';
else if(board[i][j] == 'D') board[i][j] = 'O';
}
}
}
public void dfs(char[][] board, int x, int y){
if(x<0 || x>=board.length || y<0 || y>=board[0].length || board[x][y] != 'O') return ;
board[x][y] = 'D';
dfs(board, x-1, y);
dfs(board, x, y-1);
dfs(board, x+1, y);
dfs(board, x, y+1);
}
}
解法二:改成BFS,通过
public class Solution {
private char[][] board;
private Queue<Integer> q = new LinkedList<Integer>();
private int row, col;
public void solve(char[][] board) {
if(board == null || board.length == 0) return ;
this.board = board;
row = board.length;
col = board[0].length;
for(int i=0; i<row; i++){
bfs(i, 0);
bfs(i, col-1);
}
for(int j=0; j<col; j++){
bfs(0, j);
bfs(row-1, j);
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(board[i][j] == 'O') board[i][j] = 'X';
else if(board[i][j] == 'D') board[i][j] = 'O';
}
}
}
public void fill(int x, int y){
if(x<0 || x>=board.length || y<0 || y>=board[0].length || board[x][y] != 'O') return ;
board[x][y] = 'D';
q.offer(x*col + y);//注意是col而不是row
}
public void bfs(int x, int y){
fill(x, y);
while(!q.isEmpty()){
int v = q.poll();
int i = v / col;
int j = v % col;
fill(i+1, j);
fill(i-1, j);
fill(i, j-1);
fill(i, j+1);
}
}
}