力扣 leetcode 130. 被围绕的区域

问题描述

给你一个 m * n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 'X' 或 'O'

示例

示例 1:

输入:board = [["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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

输入:board = [["X"]]
输出:[["X"]]

解题思路

本题考查的还是图的遍历,我们使用 BFS 来解决。首先,需要找出边界上的 'O' 点,然后再根据这些点来找出与之相连的其它 'O' 点。

将边界上的'O' 点以及与之相邻的 'O' 点标记,在之后的染色过程中不对这些点进行染色。

最后,将所有未标记的 'O' 点染色。

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        const int m = board.size();
        const int n = board[0].size();
        if(m < 3 || n < 3){
            return;
        }
        vector<vector<bool>> dye(m, vector<bool> (n, true));
        queue<pair<int, int>> q;
        int x = 0;
        int y = 0;
        // 找出第一行中的 O 点
        for(int i = 0; i < n; i++){
            if(board[0][i] == 'O'){
                dye[0][i] = false;
                q.emplace(0, i);
            }
        }
        // 找出最后一行中的 O 点
        for(int i = 0; i < n; i++){
            if(board[m - 1][i] == 'O'){
                dye[m - 1][i] = false;
                q.emplace(m - 1, i);
            }
        }
        // 找出第一列中的 O 点
        for(int i = 1; i < m; i++){
            if(board[i][0] == 'O'){
                dye[i][0] = false;
                q.emplace(i, 0);
            }
        }
        // 找出最后一列中的 O 点
        for(int i = 1; i < m; i++){
            if(board[i][n - 1] == 'O'){
                dye[i][n - 1] = false;
                q.emplace(i, n - 1);
            }
        }
        // 遍历之前找出的 O 点
        while(!q.empty()){
            x = q.front().first;
            y = q.front().second;
            q.pop();
            if(x > 0 && board[x - 1][y] == 'O' && dye[x - 1][y]){
                dye[x - 1][y] = false;
                q.emplace(x - 1, y);
            }
            if(x < m - 1 && board[x + 1][y] == 'O' && dye[x + 1][y]){
                dye[x + 1][y] = false;
                q.emplace(x + 1, y);
            }
            if(y > 0 && board[x][y - 1] == 'O' && dye[x][y - 1]){
                dye[x][y - 1] = false;
                q.emplace(x, y - 1);
            }
            if(y < n - 1 && board[x][y + 1] == 'O' && dye[x][y + 1]){
                dye[x][y + 1] = false;
                q.emplace(x, y + 1);
            }
        }
        // 染色
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(board[i][j] == 'O' && dye[i][j]){
                    board[i][j] = 'X';
                }
            }
        }
    }
};
posted @ 2022-12-06 22:51  greatestchen  阅读(13)  评论(0编辑  收藏  举报