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
public class Solution {
public void solve(char[][] board) {
int rows = board.length;
if(rows<=0) return;
int cols = board[0].length;
if(cols<=0) return;
boolean flag[][] = new boolean[rows][cols];
ArrayList<Integer> queue_x = new ArrayList<Integer>();
ArrayList<Integer> queue_y = new ArrayList<Integer>();
boolean OK = true;
int[] dir_x = new int[]{-1,1,0,0};
int[] dir_y = new int[]{0,0,-1,1};
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(board[i][j]=='O'&&!flag[i][j]){
int low = 0;
int high = 1;
OK = true;
queue_x.add(i);
queue_y.add(j);
while(low<high){
for(int k=0;k<4;k++){
int x = queue_x.get(low)+dir_x[k];
int y = queue_y.get(low)+dir_y[k];
if(x>=0&&x<rows&&y>=0&&y<cols){
if(!flag[x][y]&&board[x][y]=='O'){
queue_x.add(x);
queue_y.add(y);
flag[x][y]=true;
high++;
}
}else{
OK = false;
}
}
low++;
}
if(OK){
for(int k=0;k<queue_x.size();k++){
board[queue_x.get(k)][queue_y.get(k)] = 'X';
}
}
queue_x.clear();queue_y.clear();
}
}
}
}
}