130. Surrounded Regions

来源:互联网 发布:联通3g是什么网络模式 编辑:程序博客网 时间:2024/06/08 16:32

Surrounded Regions

原题叙述

原题链接:https://leetcode.com/problems/surrounded-regions/#/description
Given a 2D board containing ‘X’ and ‘O’ (the letter O), capture all regions surrounded by ‘X’.

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

For example,
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

给出一个二维矩阵,含有“X”和“O”字符,把所有被X完全包围着的O都替换成X。

例如:初始矩阵如上图,可以看到中间的3个O都是被包围的,所以全部换成X,最下面一行的O由于下面没有被X包围,所以不用替换。

思路

直接考虑被包围的部分比较麻烦,换个角度看,我们只需要考虑不被包围的O就可以了,剩下的O全部换成X就行了。
方法:扫描矩阵的4条边,如果是O的话,从这个点开始层序遍历,凡是和它相连的O(包括自己)都换成其他字符(用来表示不被包围的O),比如“Q”,然后遍历矩阵,凡是O的就表示是被包围的,全部换成X,其他的不被包围的O已经换成了Q,直接替换回O就可以了。

参考代码

class Solution {public:    void solve(vector<vector<char>>& board) {        int row = board.size();        if(row <= 1) return;        int col = board[0].size();        if(col <= 1) return;        for(int i = 0; i < row; ++i) {            if(board[i][0] == 'O') {                BFS(board, i, 0, row, col);            }            if(board[i][col - 1] == 'O') {                BFS(board, i, col - 1, row, col);            }        }        for(int j = 0; j < col; ++j) {            if(board[0][j] == 'O') {                BFS(board, 0, j, row, col);            }            if(board[row - 1][j] == 'O') {                BFS(board, row - 1, j, row, col);            }        }        for(int i = 0; i < row; ++i) {            for(int j = 0; j < col; ++j) {                if(board[i][j] == 'O') board[i][j] = 'X';                else if(board[i][j] == 'Q') board[i][j] = 'O';            }        }    }private:    void BFS(vector<vector<char>>& b, int i, int j, int row, int col) {        pair<int, int> p(i, j);        pair<int, int> tp;        queue<pair<int, int>> q;        q.push(p);        b[p.first][p.second] = 'Q';        while(!q.empty()) {            tp = q.front();            q.pop();            if(tp.first + 1 < row && b[tp.first + 1][tp.second] == 'O') {                p.first = tp.first + 1;                p.second = tp.second;                b[p.first][p.second] = 'Q';                q.push(p);            }            if(tp.first - 1 >= 0 && b[tp.first - 1][tp.second] == 'O') {                p.first = tp.first - 1;                p.second = tp.second;                b[p.first][p.second] = 'Q';                q.push(p);            }            if(tp.second - 1 >= 0 && b[tp.first][tp.second - 1] == 'O') {                p.first = tp.first;                p.second = tp.second - 1;                b[p.first][p.second] = 'Q';                q.push(p);            }            if(tp.second + 1 < col && b[tp.first][tp.second + 1] == 'O') {                p.first = tp.first;                p.second = tp.second + 1;                b[p.first][p.second] = 'Q';                q.push(p);            }        }    }};
0 0