• LeetCode //C - 130. Surrounded Regions


    130. Surrounded Regions

    Given an m x n matrix board containing ‘X’ and ‘O’, capture all regions that are 4-directionally surrounded by ‘X’.

    A region is captured by flipping all ‘O’ s into ‘X’ s in that surrounded region.
     

    Example 1:

    在这里插入图片描述

    Input: board = [[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”],[“X”,“X”,“O”,“X”],[“X”,“O”,“X”,“X”]]
    Output: [[“X”,“X”,“X”,“X”],[“X”,“X”,“X”,“X”],[“X”,“X”,“X”,“X”],[“X”,“O”,“X”,“X”]]
    Explanation: Notice that an ‘O’ should not be flipped if:

    • It is on the border, or
    • It is adjacent to an ‘O’ that should not be flipped.

    The bottom ‘O’ is on the border, so it is not flipped.
    The other three ‘O’ form a surrounded region, so they are flipped.

    Example 2:

    Input: board = [[“X”]]
    Output: [[“X”]]

    Constraints:
    • m == board.length
    • n == board[i].length
    • 1 <= m, n <= 200
    • board[i][j] is ‘X’ or ‘O’.

    From: LeetCode
    Link: 130. Surrounded Regions


    Solution:

    Ideas:
    1. Iterate over the boundary (four sides) of the board.
    2. For every ‘O’ on the boundary, perform a Depth First Search (DFS) to mark all 'O’s connected to it with a temporary marker, such as ‘B’, to denote that these 'O’s are on the boundary or connected to the boundary and should not be flipped.
    3. After marking all 'O’s on the boundary and the ones connected to it, iterate over the entire board. Perform the following operations:
      • Change all ‘B’ to ‘O’ as these are not surrounded by ‘X’.
      • Change all remaining ‘O’ to ‘X’ as these are surrounded by ‘X’.
    Code:
    void dfs(char** board, int i, int j, int m, int n) {
        if(i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O') return;
        
        // mark the current cell as 'B'
        board[i][j] = 'B';
        
        // perform DFS in all four directions
        dfs(board, i+1, j, m, n);
        dfs(board, i-1, j, m, n);
        dfs(board, i, j+1, m, n);
        dfs(board, i, j-1, m, n);
    }
    
    void solve(char** board, int boardSize, int* boardColSize) {
        if(boardSize == 0 || boardColSize[0] == 0) return;
        
        int m = boardSize, n = boardColSize[0];
        
        // Step 1: mark the boundary 'O's and the ones connected to them with 'B'
        for(int i = 0; i < m; i++) {
            dfs(board, i, 0, m, n); // left boundary
            dfs(board, i, n-1, m, n); // right boundary
        }
        
        for(int j = 0; j < n; j++) {
            dfs(board, 0, j, m, n); // top boundary
            dfs(board, m-1, j, m, n); // bottom boundary
        }
        
        // Step 2: flip the remaining 'O's to 'X' and 'B's back to 'O'
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(board[i][j] == 'O') board[i][j] = 'X';
                if(board[i][j] == 'B') board[i][j] = 'O';
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    QT内存管理
    C++学习:list
    浅谈Spring中JDK动态代理和CGLIB动态代理
    JavaScript的同步和异步问题
    Java快速入门
    独孤思维:没学会走就要跑,你只能一辈子是穷b
    python创建空列表
    运筹优化领域内精确算法、启发式算法和深度强化学习算法的优劣
    上手之Python之文件操作
    【可靠性测试】什么是可靠性测试:定义、方法和工具
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133156457