当前位置: 首页 > news >正文

130. 被围绕的区域(BFS)

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' 组成,捕获 所有 被围绕的区域

  • 连接:一个单元格与水平或垂直方向上相邻的单元格连接。
  • 区域:连接所有 'O' 的单元格来形成一个区域。
  • 围绕:如果您可以用 'X' 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。

通过 原地 将输入矩阵中的所有 'O' 替换为 'X' 来 捕获被围绕的区域。你不需要返回任何值。

示例 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"]]

解释:

在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。

示例 2:

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

输出:[["X"]]

提示:

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

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        
        int dx[]={0,0,-1,1};
        int dy[]={1,-1,0,0};
        queue<pair<int,int>> q;
        int m=board.size();
        int n=board[0].size();

        for(int i=0;i<m;i++){
            if(board[i][0]=='O'){
                q.push({i,0});
                board[i][0]='1';
            }
            if(board[i][n-1]=='O'){
                q.push({i,n-1});
                board[i][n-1]='1';
            }
        }

        for(int i=0;i<n;i++){
            if(board[0][i]=='O'){
                q.push({0,i});
                board[0][i]='1';
            }
            if(board[m-1][i]=='O'){
                q.push({m-1,i});
                board[m-1][i]='1';
            }
        }

            while(q.size()){
                auto [x,y]=q.front();
                q.pop();
                    for(int i=0;i<4;i++){
                        int nx=x+dx[i];
                        int ny=y+dy[i];
                        if(nx>=0 && nx<m &&ny>=0 && ny<n && board[nx][ny]=='O'){
                            board[nx][ny]='1';
                            q.push({nx,ny});

                        }
                    }
                }
                for(int i=0;i<m;i++){
                    for(int j=0;j<n;j++){
                        if(board[i][j]=='O'){
                            board[i][j]='X';
                        }
                        if(board[i][j]=='1'){
                            board[i][j]='O';
                        }
                    }
                }
  
    }
};

找到四周上的 'O',入队并标记为 '1'。

最后遍历矩阵,将未标记的 'O' 改为 'X',将 '1' 恢复为 'O'。

相关文章:

  • 如何利用SpringSecurity进行认证与授权
  • 【数据结构】LRUCache|并查集
  • 计算机毕业设计SpringBoot+Vue.js健身房管理系统(源码+文档+PPT+讲解)
  • AbMole揭秘伤口愈合:IGF-1-SP1-CD248信号通路的新发现
  • Java并发编程之ConcurrentHashMap的原理和使用
  • Windows 11【1001问】查看Windows是否激活的11种方法
  • Java8面试
  • React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序
  • 高频 SQL 50 题基础版_1667. 修复表中的名字
  • 字符串的原理
  • string的模拟实现
  • 探秘 Mininet:解锁网络仿真与 SDN 开发的密码
  • 【练习】【栈】牛客NC212914牛牛与后缀表达式
  • Tax with SAP S4HANA (Michael Fuhr, Dirk Heyne, Nadine Teichelmann etc.)
  • DeepSeek 与云原生后端:AI 赋能现代应用架构
  • FunPapers[3]:WWW‘25「快手」生成式回归预测观看时长
  • AI: Cursor是否已奠定AI开发环境的龙头地位?
  • GIT工具学习【1】:基本操作
  • 【Linux】【网络】不同子网下的客户端和服务器通信其它方式
  • Linux之yum详解
  • 德州一女子做医美突发心脏骤停昏迷一个多月,涉事机构已关门拆招牌
  • 金融监管总局等八部门:引导银行向小微企业贷款倾斜核销空间和资源,释放更多信贷资源
  • 四川省政府党组成员、副省长、省公安厅厅长叶寒冰接受审查调查
  • 多名幼师殴打女童被行拘后续,盘锦教育局工作人员:该局将专项整治全市幼儿园
  • 总书记回信二周年之际,上海如何将垃圾分类深度融入城市发展?
  • 日月谭天 | 赖清德倒行逆施“三宗罪”,让岛内民众怒不可遏