• 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
  • 相关阅读:
    VR全景对线上商家和企业能带来哪些好处?
    【Day-35慢就是快】代码随想录-二叉树-二叉搜索树的最近公共祖先
    米尔MYD-JX8MPQ yocto
    C# 结构体转字节数组
    Maven 使用教程
    MyCat2搭建读写分离
    Android学习之路(18) 数据存储与访问
    电脑怎么改图片格式?图片转格式怎么转?
    使用污点分析检查log4j问题
    【链表专题】
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133156457