Surrounded Regions
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.
Example
X X X X
X O O X
X X O X
X O X X
After capture all regions surrounded by'X', the board should be:
X X X X
X X X X
X X X X
X O X X
public void surroundedRegions(char[][] board) {
if(board == null || board.length == 0 || board[0].length == 0) {
return ;
}
for(int i = 0; i < board.length; i++) {
if(board[i][0] == 'O') {
bfs(board, i, 0);
}
if(board[i][board[0].length - 1] == 'O') {
bfs(board, i, board[0].length - 1);
}
}
for(int i = 0; i < board[0].length; i++) {
if(board[0][i] == 'O') {
bfs(board, 0, i);
}
if(board[board.length - 1][i] == 'O') {
bfs(board, board.length - 1, i);
}
}
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(board[i][j] == 'O') {
board[i][j] = 'X';
}
if(board[i][j] == '$') {
board[i][j] = 'O';
}
}
}
}
public void bfs(char[][] board, int i, int j) {
Queue<Node> queue = new LinkedList<Node>();
boolean[][] visited = new boolean[board.length][board[0].length];
queue.offer(new Node(i, j));
while(!queue.isEmpty()) {
Node tmp = queue.poll();
int x = tmp.x;
int y = tmp.y;
board[x][y] = '$';
if(x + 1 >= 0 && x + 1 < board.length && y >= 0 && y < board[0].length && board[x + 1][y] == 'O' && !visited[x + 1][y]) {
queue.offer(new Node(x + 1, y));
visited[x + 1][y] = true;
}
if(x - 1 >= 0 && x - 1 < board.length && y >= 0 && y < board[0].length && board[x - 1][y] == 'O' && !visited[x - 1][y]) {
queue.offer(new Node(x - 1, y));
visited[x - 1][y] = true;
}
if(x >= 0 && x < board.length && y + 1 >= 0 && y + 1 < board[0].length && board[x][y + 1] == 'O' && !visited[x][y + 1]) {
queue.offer(new Node(x, y + 1));
visited[x][y + 1] = true;
}
if(x >= 0 && x < board.length && y - 1 >= 0 && y - 1 < board[0].length && board[x][y - 1] == 'O' && !visited[x][y - 1]) {
queue.offer(new Node(x, y - 1));
visited[x][y - 1] = true;
}
}
}
class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}