zoukankan      html  css  js  c++  java
  • 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    C# DictionaryHelper
    C# Autofac 的 BeanFactory
    正则替换
    java页面表格导出为Excel实现
    CentOS 7 下安装Nginx
    认识Java 虚拟机的架构
    06 查看网卡实时流量
    05 找出占用CPU、内存过高的进程
    04 一键查看服务器资源利用率
    03 批量创建100个用户并设置随机密码
  • 原文地址:https://www.cnblogs.com/itdef/p/13479377.html
Copyright © 2011-2022 走看看