1. 程式人生 > 實用技巧 >130. 被圍繞的區域

130. 被圍繞的區域

給定一個二維的矩陣,包含 '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
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。