给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X

运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

 

class Solution {
    boolean[][] visited;
    // 创建一个节点,存储x, y
     public class Pos{
        int i;
        int j;
        Pos(int i, int j) {
            this.i = i;
            this.j = j;
        }
    }

    
    public void solve(char[][] board) {
        if(board.length == 0)
            return;
        int rows = board.length, cols = board[0].length;
        visited = new boolean[rows][cols];
        // 左侧一列
        for(int i = 0; i < rows; i++) {
            if(board[i][0] == 'O' && visited[i][0] != true) {
                bfs(board, i, 0);
            }
        }
        // 上侧一列
        for(int i = 0; i < cols; i++) {
            if(board[0][i] == 'O' && visited[0][i] != true) {
                bfs(board, 0, i);
            }
        }
        // 右侧一列
        for(int i = 0; i < rows; i++) {
            if(board[i][cols - 1] == 'O' && visited[i][cols - 1] != true) {
                bfs(board, i, cols - 1);
            }
        }
        // 下侧一列
        for(int i = 0; i < cols; i++) {
            if(board[rows - 1][i] == 'O' && visited[rows - 1][i] != true) {
                bfs(board, rows - 1, i);
            }
        }
        
        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < cols; j++) {
                if(!visited[i][j]) {
                    board[i][j] = 'X';
                }
            }
        }

    }
    
     public void bfs(char[][] board, int i, int j) {
         Queue<Pos> queue = new LinkedList<>();
         queue.add(new Pos(i, j));
         visited[i][j] = true;
         while(!queue.isEmpty()) {
             Pos current = queue.poll();
             // 上
            if (current.i - 1 >= 0 
                && board[current.i - 1][current.j] == 'O' 
                && !visited[current.i - 1][current.j]) {
                queue.add(new Pos(current.i - 1, current.j));
                visited[current.i - 1][current.j] = true;
              	// 没有continue.
            }
            // 下
            if (current.i + 1 <= board.length - 1 
                && board[current.i + 1][current.j] == 'O' 
                && !visited[current.i + 1][current.j]) {
                queue.add(new Pos(current.i + 1, current.j));
                visited[current.i + 1][current.j] = true;      
            }
            // 左
            if (current.j - 1 >= 0 
                && board[current.i][current.j - 1] == 'O' 
                && !visited[current.i][current.j - 1]) {
                queue.add(new Pos(current.i, current.j - 1));
                visited[current.i][current.j - 1] = true;
            }
            // 右
            if (current.j + 1 <= board[0].length - 1 
                && board[current.i][current.j + 1] == 'O'
               && !visited[current.i][current.j + 1]) {
                queue.add(new Pos(current.i, current.j + 1));
                visited[current.i][current.j + 1] = true;
            }
         }
         
     }
    
    
}

  

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。