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看完题目相信大家都有个思路:只要这个0是在边界,那么它肯定不行,而且所有和这个0相连接的0都不行。所以我们首先找到边界上的0,然后进行dfs找到与它相连接的0,别切用一个boolean数组标记已经来过。
public class surroundedRegions {
public static void main(String args[]){
surroundedRegions sr = new surroundedRegions();
char sample[][]={{'X','X','X'},{'X','0','X'},{'X','X','X'}};
sr.solve(sample);
for(int i=0;i<sample.length;i++){
for(int j=0;j<sample[0].length;j++){
System.out.print(sample[i][j]);
}
System.out.println();
}
}
public void solve(char[][] board) {
if (board == null || board.length == 0) {
return;
}
int height = board.length;
int width = board[0].length;
boolean[][] visit = new boolean[height][width];
for(int i = 0 ; i < width; i++){
if(board[0][i] == 'O') visit[0][i] = true;
if(board[height - 1][i] == 'O') visit[height - 1][i] = true;
}
for(int i = 0 ; i < height; i++){
if(board[i][0] == 'O') visit[i][0] = true;
if(board[i][width - 1] == 'O') visit[i][width - 1] = true;
}
for(int i = 0 ; i < visit.length; i++){
for(int j = 0; j < visit[0].length;j++){
if(visit[i][j]){
dfs(board, visit, i, j);
}
}
}
for(int i = 1; i < height; i++){
for(int j = 1; j < width; j++){
if(board[i][j] == 'O' && !visit[i][j]){
board[i][j] = 'X';
}
}
}
}
private void dfs(char[][] board,boolean[][] visit,int i ,int j){
visit[i][j] = true;
if(i > 0 && board[i - 1][j] == 'O' && !visit[i - 1][j]){
dfs(board, visit, i - 1, j);
}
if(i < visit.length - 1 && board[i + 1][j] == 'O' && !visit[i + 1][j]){
dfs(board, visit, i + 1, j);
}
if(j > 0 && board[i][j - 1] == 'O' && !visit[i][j - 1]){
dfs(board, visit, i, j - 1);
}
if(j < visit[0].length - 1 && board[i][j + 1] == 'O' && !visit[i][j + 1]){
dfs(board, visit, i, j + 1);
}
}