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;
    }
}

results matching ""

    No results matching ""