LeetCode 130. 被围绕的区域 bfs

地址 https://leetcode-cn.com/problems/surrounded-regions/

给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X
解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

算法1
本题目使用BFS 找出与边连接的’O’,那么剩下的’O’就是需要填写为’X’的。
考虑到邻接特性 所以使用并查集也是可以的

class Solution {
public:
   
int addx[4] = { 1,-1,0,0 };
int addy[4] = { 0,0,-1,1 };


void solve(vector<vector<char>>& board) {
    if (board.size() == 0 || board[0].size() == 0) return;
    int n = board.size(); int m = board[0].size();

    queue<pair<int, int>> q;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if ( (i == 0 || j == 0 || i == n - 1 || j == m-1 ) &&  board[i][j] == 'O') {
                //只要是边上的 O 就放入BFS搜索队列
                board[i][j] = 'T';
                q.push({ i,j });
            }
        }
    }

    while (q.size()) {
        int x = q.front().first; 
        int y = q.front().second;
        q.pop();

        for (int i = 0; i < 4; i++) {
            int newx = x + addx[i];
            int newy = y + addy[i];

            if (newx >= 0 && newx < n && newy >= 0 && newy < m && board[newx][newy] == 'O') {
                board[newx][newy] = 'T';
                q.push({ newx,newy });
            }
        }
    }

    //遍历完成后 所有与边相邻的O 变成了T
    //我需要全部填充X 然后将T变成O 即可
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (board[i][j] == 'T') {
                board[i][j] = 'O'; 
            }
            else if (board[i][j] != 'X') {
                board[i][j] = 'X';
            }
        }
    }

    return;
}

};

 

posted on 2020-08-11 19:04  itdef  阅读(114)  评论(0编辑  收藏  举报

导航