• 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;
    }
    
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    NAMESPACE
    所谓has a 和 is a
    C++ 的多重继承
    c# 与 c++ 编译
    初始化的顺序:和定义的顺序以及初始化函数都有关系。都要先定义的在前,后定义的在后。甚至连类的顺序都必须这样。
    关于转换
    隐藏
    第四章第四个例题(LRJ)
    初来扎到啊(觉得有些神圣尼)
    理解JS的执行环境
  • 原文地址:https://www.cnblogs.com/itdef/p/13479377.html
Copyright © 2020-2023  润新知