[LintCode] Surrounded Regions 包围区域

Posted Grandyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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);
    }
};

 

以上是关于[LintCode] Surrounded Regions 包围区域的主要内容,如果未能解决你的问题,请参考以下文章

[LintCode] Surrounded Regions 包围区域

[LeetCode] 130. Surrounded Regions

Surrounded Regions

Surrounded Regions - LeetCode

Surrounded Regions

130. Surrounded Regions