• 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
  • 相关阅读:
    php中判断指定字符串是否包含指定字符的封装函数
    电源差异。
    爬虫基础入门理论上篇
    2023-简单点-什么是onnx?
    Vue.js正式环境中配置多个请求的URL
    【WebRTC---源码篇】(十:零)WEBRTC/StreamStatisticianImpl持续更新中)
    e智团队实验室项目-第二周-卷积神经网络的学习
    【SCAU操作系统】期末复习选择题例题解析
    在 Spring 4.3.9下升级 Velocity 1.7.x to Velocity 2.0.x 出现的问题
    dotnet-dump工具使用
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133156457