FloodFill算法——力扣被围绕的区域

这篇具有很好参考价值的文章主要介绍了FloodFill算法——力扣被围绕的区域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目解析

被围绕的区域
FloodFill算法——力扣被围绕的区域,算法,算法,leetcode
我们来解读一下这个题目,这个题目的意思就是求出被X围绕的O有多少个,那么什么是被围绕呢?也就是没有出路并且连通的O不能到四条边上,这就算是被围绕了,可是即使知道了这些信息我们依旧头大因为,太难分析了我们遇到一个O之后还得去看看这一块儿O是不是被围绕的如果不是被围绕的还得去将他们回复成原来的O很难的了。那么咱么办呢?

算法解析

那么我们就反其道而行之,怎么反其道而行之呢?很简单那就是求没有被围绕的O然后将这些O变成随便的一个字符只要不是X或者O就行然后再将此时剩下的O全部变成X把你当时转换的字符重新转换成O就可以了,那么我们就要知道哪些O是不能被围绕的呢?上面说了嘛只要是在四条边上的O肯定都不能被围绕所以我们只需要找到四条边上的O以及与四条边上的O相连的就可以了。文章来源地址https://www.toymoban.com/news/detail-843130.html

代码解析

class Solution {
public:
 int dx[4] = { 0,0,-1,1 };
    int dy[4] = { 1,-1,0,0 };
    void solve(vector<vector<char>>& board) {
         int m = board.size();
         int n = board[0].size();
         for (int j = 0; j < n; j++) {
            
            if(board[0][j]=='O'){
                board[0][j]='*';
                bfs(board,0,j);    
            }
        }
        for (int j = 0; j < m; j++) {
            if(board[j][0]=='O'){
                board[j][0]='*';
                bfs(board,j,0);    
            }
        }
        for (int j = 0; j <m; j++) {
            
            if(board[j][n-1]=='O'){
                board[j][n-1]='*';
                bfs(board,j,n-1);    
            }
        }
        for (int j = 0; j <n; j++) {
            
            if(board[m-1][j]=='O'){
                board[m-1][j]='*';
                bfs(board,m-1,j);    
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                //cout<<board[i][j]<<' ';
                if(board[i][j]=='O'){
                    board[i][j]='X';
                }else if(board[i][j]=='*'){
                    board[i][j]='O';
                }
            }
            //cout<<endl;
        }
    }
    void bfs(vector<vector<char>>& board, int i, int j) {
        queue<pair<int, int>>q;
        q.push({ i,j });
        while (q.size()) {
            auto [a, b] = q.front();
            q.pop();
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if(x>=0&&y>=0&&x<board.size()&&y<board[0].size()&&board[x][y]=='O'){
                    board[x][y]='*';
                    q.push({x,y});
                }
            }
        }
    }
};

到了这里,关于FloodFill算法——力扣被围绕的区域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 130. 被围绕的区域

    130. 被围绕的区域 https://leetcode.cn/problems/surrounded-regions/ 那就是边上的永远不会被包裹,所以我们就先检查边上的能覆盖的范围,最后再检查一遍得出结果 因为后面的dfs里的判断 重复检查的话,就会被return掉。 是字母‘O’欧,不是0,害我检查了20多分钟= =~

    2024年02月16日
    浏览(30)
  • 代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

    **题目:**给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接:130. 被围绕的区域 解题思路:在飞地的基础上做改动,使用一个栈存储需要改变的节点 题目 :有一个 m × n 的矩形岛

    2024年02月04日
    浏览(52)
  • 代码随想录图论 第三天 | 130. 被围绕的区域 417. 太平洋大西洋水流问题

    代码随想录图论 第三天 | 130. 被围绕的区域 417. 太平洋大西洋水流问题 一、130. 被围绕的区域 题目链接:https://leetcode.cn/problems/surrounded-regions/ 思路:题目要求沾边的不动,只改没沾边的,那么可以先dfs遍历4条边,把沾边的O都改成A。然后直接两层for循环遍历整个数组,把O该

    2024年02月07日
    浏览(43)
  • 代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛

    题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ 题目链接:太平洋大西洋水流问题 思路:从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而

    2024年01月16日
    浏览(56)
  • 【算法专题】FloodFill 算法

    题目链接 - Leetcode -773.图像渲染 Leetcode -773.图像渲染 题目:有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr, sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。 为了完成 上色工作 ,从初始像

    2024年02月03日
    浏览(34)
  • 力扣(LeetCode)算法_C++—— 快乐数

    编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是

    2024年02月09日
    浏览(40)
  • 算法学习——LeetCode力扣回溯篇2

    40. 组合总和 II - 力扣(LeetCode) 描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 示例 1: 输入: candidates = [10,1,2,7

    2024年02月20日
    浏览(36)
  • 代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

    #695岛屿最大面积 模板题,很快.以下两种dfs,区别是看第一个点放不放到dfs函数中处理,那么初始化的area一个是1一个是0  bfs:对应也有两种 #1020飞地的数量 下面是自己写的dfs,过了但是很多可以改进。bfs也差不多这里就不写了  可改进的点: 1 其实遍历四周可以四个循环合

    2024年02月16日
    浏览(46)
  • 力扣(LeetCode)算法_C++—— 存在重复元素

    给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums = [1,2,3,1] 输出:true 示例 2: 输入:nums = [1,2,3,4] 输出:false 示例 3: 输入:nums = [1,1,1,3,3,4,3,2,4,2] 输出:true 提示: 1 = nums.length = 105 -1

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包