[LintCode] Surrounded Regions 包围区域

简介:

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.
A region is captured by flipping all 'O''s into 'X''s in that surrounded region.
Example
X X X X
X O O X
X X O X
X O X X
After capture all regions surrounded by 'X', the board should be:
X X X X
X X X X
X X X X
X O X X

LeetCode上的原题,请参见我之前的博客Surrounded Regions

解法一:

class Solution {
public:
    /**
     * @param board a 2D board containing 'X' and 'O'
     * @return void
     */
    void surroundedRegions(vector<vector<char>>& board) {
        if (board.empty() || board[0].empty()) return;
        int m = board.size(), n = board[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
                    if (board[i][j] == 'O') dfs(board, i , j);
                }
            }
        }
        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] == '$') board[i][j] = 'O';
            }
        }
    }
    void dfs(vector<vector<char>> &board, int x, int y) {
        int m = board.size(), n = board[0].size();
        vector<vector<int>> dir{{0,-1},{-1,0},{0,1},{1,0}};
        board[x][y] = '$';
        for (int i = 0; i < dir.size(); ++i) {
            int dx = x + dir[i][0], dy = y + dir[i][1];
            if (dx >= 0 && dx < m && dy >= 0 && dy < n && board[dx][dy] == 'O') {
                dfs(board, dx, dy);
            }
        }
    }
};

解法二:

class Solution {
public:
    /**
     * @param board a 2D board containing 'X' and 'O'
     * @return void
     */
    void surroundedRegions(vector<vector<char>>& board) {
        if (board.empty() || board[0].empty()) return;
        int m = board.size(), n = board[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
                    if (board[i][j] == 'O') dfs(board, i , j);
                }
            }
        }
        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] == '$') board[i][j] = 'O';
            }
        }
    }
    void dfs(vector<vector<char>> &board, int i, int j) {
        int m = board.size(), n = board[0].size();
        if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O') return;
        board[i][j] = '$';
        dfs(board, i + 1, j);
        dfs(board, i - 1, j);
        dfs(board, i, j + 1);
        dfs(board, i, j - 1);
    }
};

本文转自博客园Grandyang的博客,原文链接:包围区域[LintCode] Surrounded Regions ,如需转载请自行联系原博主。

相关文章
|
定位技术
95Echarts - 地理坐标/地图(Binning on Map)
95Echarts - 地理坐标/地图(Binning on Map)
70 0
Halcon区域region的生成,使用点坐标
Halcon区域region的生成,使用点坐标
911 0
|
定位技术
94Echarts - 地理坐标/地图(Use lines to draw 1 million ny streets.)
94Echarts - 地理坐标/地图(Use lines to draw 1 million ny streets.)
75 0
|
定位技术
92Echarts - 地理坐标/地图(A Hiking Trail in Hangzhou - Baidu Map)
92Echarts - 地理坐标/地图(A Hiking Trail in Hangzhou - Baidu Map)
47 0
|
定位技术
91Echarts - 地理坐标/地图(A Hiking Trail in Hangzhou - Baidu Map)
91Echarts - 地理坐标/地图(A Hiking Trail in Hangzhou - Baidu Map)
69 0
|
定位技术
93Echarts - 地理坐标/地图(Bus Lines of Beijing - Line Effect)
93Echarts - 地理坐标/地图(Bus Lines of Beijing - Line Effect)
80 0
|
图形学
Unity【Bounds & Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内
Unity【Bounds & Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内
575 0
Unity【Bounds & Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内
2019ICPC上海K-Color Graph(二分图 状压枚举)
2019ICPC上海K-Color Graph(二分图 状压枚举)
97 0
ICPC Greater New York Region 2020 (模拟)
ICPC Greater New York Region 2020 (模拟)
113 0
|
机器学习/深度学习
2019ICPC上海Spanning Tree Removal构造题
本题是一个spj的问题 题意是给定一个完全图,包含了n个节点,每次可以在这个图中选择一个生成树,然后将该生成树的所有边都删除,然后得到一个新图,然后再从新的图中重复上述操作,问最多可以操作多少次,对于每一次操作,输出选择的生成树中的所有边(n-1行) 在lc哥的图中稍加改造,做成这个样子: 图中有6个点,将点按照0 -> 5编号
122 0
2019ICPC上海Spanning Tree Removal构造题