首页 > 其他分享 >力扣 leetcode 130. 被围绕的区域

力扣 leetcode 130. 被围绕的区域

时间:2022-12-06 23:03:53浏览次数:46  
标签:emplace int 力扣 130 board && dye false leetcode

问题描述

给你一个 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';
                }
            }
        }
    }
};

标签:emplace,int,力扣,130,board,&&,dye,false,leetcode
From: https://www.cnblogs.com/greatestchen/p/16961691.html

相关文章

  • hdu1300 Pearls--DP
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1300​​一:原题内容ProblemDescriptionInPearlaniaeverybodyisfondofpearls.Onecompany,calle......
  • #yyds干货盘点# LeetCode程序员面试金典:移除重复节点
    题目:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1,2,3,3,2,1]输出:[1,2,3]示例2:输入:[1,1,1,1,2]输出:[1,2]代码实现:classSolu......
  • 「查找表」字符串中不同整数的数目(力扣第1805题)
    本题为12月6日力扣每日一题题目来源:力扣第1805题题目tag:查找表双指针题面题目描述给你一个字符串word,该字符串由数字和小写英文字母组成。请你用空格替换每个不......
  • 力扣刷题03
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • 力扣378(java&python)-有序矩阵中第 K 小的元素(中等)
    题目:给你一个 nxn 矩阵 matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到......
  • 【LeetCode】第43天 - 136. 只出现一次的数字 | 169. 多数元素
    文章目录​​136.只出现一次的数字​​​​题目描述​​​​解题思路​​​​代码实现​​​​169.多数元素​​​​题目描述​​​​解题思路​​​​代码实现​​136.......
  • 【LeetCode】第44天 - 100. 相同的树
    100.相同的树​​题目描述​​​​解题思路​​​​代码实现​​题目描述给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并......
  • 【LeetCode】第47天 - 944. 删列造序
    944.删列造序​​题目描述​​​​解题思路​​​​代码实现​​题目描述解题思路此题比较简单,详见代码注释。代码实现classSolution{publicintminDeletionSize(St......
  • 【LeetCode】第48天 - 1037. 有效的回旋镖
    1037.有效的回旋镖​​题目描述​​​​解题思路​​​​代码实现​​题目描述解题思路没想到遇到一道纯数学题。所谓的“有效的回旋镖”就是指所给的三个点不在同一条直线......
  • [LeetCode] 1805. Number of Different Integers in a String
    Youaregivenastring word thatconsistsofdigitsandlowercaseEnglishletters.Youwillreplaceeverynon-digitcharacterwithaspace.Forexample, "a1......