鸡汤炖什么菜好吃| 麒麟臂什么意思| 尿素肌酐高是什么原因| 菠萝蜜过敏什么症状| 扩心病是什么病| 什么满天下| 为什么饿了会想吐| d二聚体高是什么意思| 公分是什么意思| bodywash是什么意思| 拉抽屉是什么现象| 中性人是什么意思| laurel是什么牌子| 手上起倒刺是缺什么| 下面有异味是什么原因| 玫瑰的花语是什么| 乳头内陷是什么原因| 什么路不能走| 鸡皮肤是什么原因引起的| 胎盘老化对胎儿有什么影响| 为什么会莫名其妙流鼻血| 哺乳期可以吃什么水果| opi是什么意思| 五月十二号是什么日子| 天秤和什么星座最配| johnny什么意思| 胆汁反流是什么意思| 指数是什么| 甲亢吃什么好的更快| 手柄是什么意思| 吃什么对卵巢好| 餐标是什么意思| 阴煞是什么意思| 血糖高的人吃什么| 低gi什么意思| 脑血栓有什么症状| 颌下淋巴结肿大挂什么科| 维c什么时候吃效果最好| 传导阻滞是什么意思| 口腔医学技术是什么| 浮躁的意思是什么| blazer是什么意思啊| 秦始皇原名叫什么名字| 111是什么意思| 画什么点睛| 昭和是什么意思| 为什么打哈欠| 嗓子突然哑了是什么原因引起的| 蛇属于什么动物| 巨峰葡萄为什么叫巨峰| 膝盖后面的窝叫什么| 未加一笔是什么字| 蟑螂是什么样子的| 什么是化疗| 冷宫是什么意思| coco什么意思| 拉稀肚子疼吃什么药| 为什么天空是蓝色的| 为什么叫985大学| hvr是什么意思| 伊始是什么意思| 晚上喝蜂蜜水有什么好处| 井木犴是什么动物| abs是什么材质| 手指甲发白是什么原因| 马克杯是什么意思| id是什么意思的缩写| 美尼尔眩晕症吃什么药| 身体乳有什么用| 度是什么意思| 何以笙箫默什么意思| 脚凉是什么原因造成的| 被强奸是什么感觉| 一代明君功千秋是什么生肖| 一个入一个肉念什么| 什么叫阴虚什么叫阳虚| 五大发展理念是什么| 二氧化碳高是什么原因| 27度穿什么衣服合适| 星月菩提是什么材质| 天蝎什么象| 南瓜吃多了有什么坏处| 眼压低是什么原因| 梦见滑雪是什么意思| 儿童语言迟缓挂什么科| 省内流量是什么意思| 积食内热吃什么药| 脾虚是什么原因引起的| 聚首一堂是指什么生肖| 咳嗽喝什么| 什么是中位数| 尿等待吃什么药最好| h的大写字母是什么| 亡羊补牢说明什么道理| 疾控中心属于什么单位| 梦见自己有孩子了是什么预兆| 阴历三月是什么星座| 偏光眼镜是什么意思| 4月18号是什么星座| 上海有什么烟| 稽留流产是什么原因| 芽孢是什么| 似乎是什么意思| 左小腿麻木是什么原因| 睡不着吃什么药最有效| 妈妈的哥哥的老婆叫什么| 女人肝胆湿热吃什么药| 原位癌是什么意思| 猪心炖什么治失眠| 吃什么减肥瘦肚子| 前列腺增大吃什么药| 有什么好听的歌曲| 梦遗太频繁是什么原因造成的| 什么动物没有眼睛| 睡觉打呼噜是什么病| 卧蚕是什么意思| 鹿参膏有什么作用和功效| 成语一什么不什么| 3月21日是什么星座| 胸口不舒服是什么原因| 什么花适合送老师| 晧字五行属什么| 鲟鱼吃什么| 坐月子可以吃什么| 司南是什么| 肾结石是由什么原因引起的| 巩固是什么意思| 鸦片鱼是什么鱼| 孕中期失眠是什么原因| 动物园里有什么动物| 扶乩是什么意思| 十八反是什么意思| 来姨妈吃什么水果好| d g是什么牌子| 点了斑不能吃什么| 黄瓜生吃有什么好处| 乙肝是什么病严重吗| 火把节是什么节日| gaba是什么| 横店是什么| 烧伤病人吃什么恢复快| 及笄是什么意思| 男人后背有痣代表什么| 风湿性心脏病吃什么药| 脚代表什么生肖| 什么赴什么继| 推背有什么好处和坏处| 坚什么什么什么成语| 蝎子吃什么| 胆结石吃什么药可以化掉结石| 卡介疫苗是预防什么的| 扁桃体长什么样| 精卫填海是什么故事| 牛油果和什么榨汁好喝| 算命先生是什么生肖| 免冠彩照是什么意思| 吐司是什么| 病理检查是什么意思| 常吃火龙果有什么好处| 双脚踝浮肿是什么原因| 谬论是什么意思| 请丧假需要什么证明| 宫颈癌吃什么好| 小白和兽神什么关系| 什么狗不咬人| 吃什么可以让月经快点来| 什么人容易得癌症| 月经期间洗澡会有什么影响吗| dmf是什么溶剂| 抵牾是什么意思| 绿豆什么时候收获| 重字五行属什么| 支原体感染是什么意思| 一个金字旁一个各念什么| 看到壁虎是什么征兆| 三点水弘读什么| eau是什么意思| 属虎的适合什么职业| 天贵星是什么意思| 我是小姨的什么人| 胆囊息肉样病变是什么意思| 嗳腐吞酸是什么意思| 彼此彼此是什么意思| 猫的胡须有什么用处| 什么叫语言障碍| 风湿是什么原因引起的| 社保卡属于什么银行| 内秀是什么性格的人| 脖子爱出汗是什么原因| 畏光是什么意思| 苍鹰是什么意思| 特警力量第二部叫什么| 改姓需要什么手续| 大肠杆菌属于什么菌| 母亲节做什么| 梦见吃月饼是什么意思| 辛亥革命是什么时候| 小211是什么意思| 书店买不到的书是什么书| 人类免疫缺陷病毒是什么| 耄耋什么意思| 户籍类型是什么| ft什么单位| 眉梢有痣代表什么| 喝豆浆有什么好处| 中医七情指的是什么| 五角硬币是什么材质| 抗核抗体是什么| 低血糖吃什么最快缓解| 孕妇生气对胎儿有什么影响| 皮肤疖是什么病| 世界上最多笔画的字是什么| 嵌体是什么| 亲友是什么意思| 吃什么补气养血最快| 买碗有什么讲究| 子宫内膜增厚有什么影响| 西布曲明的危害及副作用分别是什么| 一月四号是什么星座| 醋精和白醋有什么区别| 性功能下降是什么原因| 手心经常出汗是什么原因| 亚裔人是什么意思| 哀嚎是什么意思| 人为什么会低血糖| 精子是什么味道| no是什么气体| 补体c4偏低是什么意思| 经常闪腰是什么原因引起的| o发什么音| 寅五行属什么| 连铁是什么器官| 缺铁性贫血吃什么补得快| 拉直和软化有什么区别| 大姨妈量少什么原因| 遭罪是什么意思| 死鬼什么意思| 怀孕吃什么水果最好| wuli是什么意思| 腺病毒阳性是什么意思| 土豆不能和什么一起吃| 善存片适合什么人吃| 什么原因引起脑梗| 置之死地而后生是什么意思| 经常发烧是什么原因| 胃息肉是什么原因造成的| acne是什么意思| 尿毒症有些什么症状| 痔疮的表现症状是什么| 什么材质的拖鞋不臭脚| 肠胃炎吃什么水果比较好| 着凉了吃什么药| 禁锢是什么意思| 减肥吃什么食物| 烫伤起水泡涂什么药膏| 蓓字五行属什么| 什么是性高潮| 二月什么星座| 清酒是什么酒| 家里养什么动物吃蟑螂| 珍珠母是什么东西| 光顾是什么意思| 斯里兰卡说什么语言| 愚痴是什么意思| 百度
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度解析算法之BFS解决FloodFill算法

外企中国路|福特强化与中国合作伙伴关系 力挽销售颓势}

作者头像
Undoom
发布于 2025-08-06 08:31:23
发布于 2025-08-06 08:31:23
百度 A面艺术家《奔马》、《徯我后》、《田横五百士》、《愚公移山》等作品如今已经成为中国美术史上不可或缺的经典之作。 6600
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

FloodFill中文是洪水灌溉 找出在区域中性质相同的联通块

79.图像渲染

题目链接 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sccolor 。你应该从像素 image[sr][sc] 开始对图像进行上色 填充

为了完成 上色工作

  1. 从初始像素开始,将其颜色改为 color
  2. 对初始坐标的 上下左右四个方向上 相邻且与初始像素的原始颜色同色的像素点执行相同操作。
  3. 通过检查与初始像素的原始颜色相同的相邻像素并修改其颜色来继续 重复 此过程。
  4. 没有 其它原始颜色的相邻像素时 停止 操作。

最后返回经过上色渲染 修改 后的图像 。

示例 1:

输入: image = [[1,1,1],[1,1,0],[1,0,1] ],sr = 1, sc = 1, color = 2

输出:[[2,2,2],[2,2,0],[2,0,1] ]

解释: 在图像的正中间,坐标 (sr,sc)=(1,1) (即红色像素),在路径上所有符合条件的像素点的颜色都被更改成相同的新颜色(即蓝色像素)。

注意,右下角的像素 没有 更改为2,因为它不是在上下左右四个方向上与初始点相连的像素点。

示例 2:

输入: image = [[0,0,0],[0,0,0] ], sr = 0, sc = 0, color = 0

输出: [[0,0,0],[0,0,0] ]

解释: 初始像素已经用 0 着色,这与目标颜色相同。因此,不会对图像进行任何更改。

提示:

  • m == image.length
  • n == image[i].length
  • 1 <= m, n <= 50
  • 0 <= image[i][j], color < 216
  • 0 <= sr < m
  • 0 <= sc < n

题目给到了一个坐标,然后要求将这个坐标四周相连并且大小相等的格子进行染色的操作

代码语言:javascript
代码运行次数:0
运行
复制
class Solution

{

    typedef pair<int,int> PII;//就是我们的坐标

    //我们这里的数组就是我们x,y坐标周围的范围坐标,加上数组中的对应的大小就可以找到对应的位置了

    int dx[4]={0,0,1,-1};

    int dy[4]={1,-1,0,0};

public:

    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)

    {

        int prev=image[sr][sc];//标记下需要修改的像素值

        if(prev==color)return image;//处理边界情况,如果选中的像素值和我们需要修改的像素值以一样的话,那么我们直接返回imag

  

        int m=image.size(),n=image[0].size();

        queue<PII>q;//我们这里存的是坐标,就是键值对

        q.push({sr,sc});//层序遍历的时候,我们先将第一个位置丢进去

  

        while(q.size())//只要队列里面有数据的话我们就进行循环操作

        {

            auto [a,b]=q.front();//直接将队头元素拿出来

            q.pop();//头删操作

            image[a][b]=color;//我们先将这个位置进行修改的操作

            for(int i=0;i<4;i++)//遍历4个方向

            {

                int x=a+dx[i],y=b+dy[i];

                //我们这里必须保证我们的坐标是不越界的情况,我们才能将这个丢进我们的队列中去

                if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==prev)//如果这个点的值的大小等于我们的prev的值的话,那么我们就将这个点加入到队列中去

                {

                    q.push({x,y});

                }

            }

        }

        //当整个while循环结束之后,我们所有满足条件的位置都被填上了新的颜色了

        return image;

    }

};

这里我们使用到了一个坐标组了,我们的(x,y)坐标加上对应的dx和dy获得到的就是我们当前点四周的坐标的位置

image.png
image.png

80.岛屿数量

题目链接 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入: grid = [ [“1”,“1”,“1”,“1”,“0”], [“1”,“1”,“0”,“1”,“0”], [“1”,“1”,“0”,“0”,“0”], [“0”,“0”,“0”,“0”,“0”] ] **输出:**1

示例 2:

输入: grid = [ [“1”,“1”,“0”,“0”,“0”], [“1”,“1”,“0”,“0”,“0”], [“0”,“0”,“1”,“0”,“0”], [“0”,“0”,“0”,“1”,“1”] ] 输出: 3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0''1'
代码语言:javascript
代码运行次数:0
运行
复制
class Solution

{

    //上下左右的坐标范围

    int dx[4]={0,0,1,-1};

    int dy[4]={1,-1,0,0};

    bool vis[301][301];//来表示我们的数是否被遍历过

    int m,n;

public:

    int numIslands(vector<vector<char>>& grid)

    {

        m=grid.size(),n=grid[0].size();

  

        int ret=0;//统计最终结果

        for(int i=0;i<m;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(grid[i][j]=='1'&&!vis[i][j])//如果这个数等于1的话,并且没有遇到过的话

                {

                    ret++;

                    bfs(grid,i,j);//将这块陆地全部都进行标记操作

                    //如果再次遍历到标记过的数的话,我们就不进行ret++操作了,不会重复标记了

                }

            }

        }

        return ret;

    }

    void bfs(vector<vector<char>>&grid,int i,int j)

    {

        queue<pair<int,int>>q;

        q.push({i,j});//将(i,j)这个位置放进去

        vis[i][j]=true;//说明我们的这个位置遍历过了

  

        while(q.size())//如果队列中存在元素的话,我们就一直进行循环操作

        {

            auto [a,b]=q.front();//获取队列头元素

            q.pop();//删除对列头元素

  

            //将四周的坐标进行标记操作

            for(int k=0;k<4;k++)

            {

                int x=a+dx[k],y=b+dy[k];//那么这里的x和y就会随便遍历就变成我们上下左右的四个坐标了

                if(x>=0&&y>=0&&x<m&&y<n&&grid[x][y]=='1'&&vis[x][y]==false)//只要这个位置没有遍历过的话

                {

                    q.push({x,y});//将这个位置丢进去

                    vis[x][y]=true;//将这个位置状态进行改变操作

                }

            }

        }

  
  

    }

};

就是一直进行遍历操作,看看这数是否遍历过,遍历过的话我们就给这个数加上一个true的状态,并且将四周的满足条件的数字都进行判断下

81.岛屿的最大面积

题目链接 给你一个大小为 m x n 的二进制矩阵 grid

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

示例 1:

输入: grid = [ [0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] 输出: 6 解释: 答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1

示例 2:

输入: grid = [[0,0,0,0,0,0,0,0] ] 输出: 0

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • grid[i][j]01

在正常的遍历的时候进行面积的统计操作,多一个变量

代码语言:javascript
代码运行次数:0
运行
复制
class Solution

{

    int dx[4]={0,0,1,-1};

    int dy[4]={1,-1,0,0};

    bool vis[51][51];

    int m, n;

public:

    int maxAreaOfIsland(vector<vector<int>>& grid)

    {

        m=grid.size(),n=grid[0].size();

  

        int ret=0;

        for(int i=0;i<m;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(grid[i][j]==1&&vis[i][j]==false)//这个岛屿没有被统计过

                {

                    ret=max(ret,bfs(grid,i,j));

                }

            }

        }

        return ret;

    }

    int bfs(vector<vector<int>>&grid,int i,int j)

    {

        int count=0;//统计面积

        queue<pair<int,int>>q;

        q.push({i,j});//将这个数丢进队列中

        vis[i][j]=true;

        count++;

  

        while(q.size())//只要队列中有元素的话,我们就一直进行循环操作

        {

            auto [a,b]=q.front();//获取队头数据

            q.pop();//删除队头数据

  

            //接下来开始从(a,b)这个位置开始向上下左右四个位置开始找满足条件的坐标了

            for(int k=0;k<4;k++)

            {

                int x=a+dx[k],y=b+dy[k];

                if(x>=0&&y>=0&&x<m&&y<n&&grid[x][y]==1&&vis[x][y]==false)//说明这个位置之前是没有遍历过的

                {

                    q.push({x,y});//我们将这个位置添加到队列中去

                    vis[x][y]=true;

                    count++;//面积加一

                }

            }

        }

        return count;//将数据返回

    }

};

82.被围绕的区域

题目链接 给你一个 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'
代码语言:javascript
代码运行次数:0
运行
复制
class Solution

{

    int dx[4]={0,0,1,-1};

    int dy[4]={1,-1,0,0};

    int m,n;

public:

    void solve(vector<vector<char>>& board)

    {

        m=board.size(),n=board[0].size();

  
  

        //1.先处理边界上面的'O',全部修改成'.'

        for(int j=0;j<n;j++)//我们的第一行的横坐标是0,j一直在变化

        {

            //这个是第一行

            if(board[0][j]=='O')bfs(board,0,j);//将(0,j)这一行满足条件都修改为'.'

            if(board[m-1][j]=='O')bfs(board,m-1,j);//这个是对最后一行的判断

        }

        for(int i=0;i<m;i++)//现在对第一列和第一行进行处理操作

        {

            if(board[i][0]=='O')bfs(board,i,0);//第一列

            if(board[i][n-1]=='O')bfs(board,i,n-1);//最后一列

        }

  

        //2.还原

        for(int i=0;i<m;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(board[i][j]=='O')board[i][j]='X';//如果围绕的话,那么就将O修改为X

                else if(board[i][j]=='.')board[i][j]='O';//将边界的还原为'O'

  

            }

        }

    }

    void bfs(vector<vector<char>>&board,int i,int j)

    {

        queue<pair<int,int>>q;

        q.push({i,j});//将当前位置丢进去

        board[i][j]='.';//将边缘的这个位置进行一个修改的操作

  

        while(q.size())//只要队列中存在元素的话,我们就一直进行循环操作

        {

            auto[a,b]=q.front();//将队头元素拿出来

            q.pop();//删除队头元素

            for(int k=0;k<4;k++)

            {

                int x=a+dx[k],y=b+dy[k];

                if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O')//如果满足条件的话就将这个位置进队里面

                {

                    q.push({x,y});

                    board[x][y]='.';

                }

            }

        }

        //那么这个while循环结束之后就将与边界相连的区域都变成了'.'了

    }

};

我们先将第一行最后一行和第一列最后一列边界进行处理,如果边界上有’O’的话,那么我们就将这些’O’变成’.’ 处理完成这些边界情况之后,我们就进行还原操作,将整块面积中被’X’包围的’O’修改为’X’,但是如果是上面处理边界情况的结果’.'的话,那么我们就复原为’O’就行了

基本的BFS框架 让(x,y)这个位置进队列,然后对这个位置的数据进行修改,然后就开始我们的while循环将这个点四周的点都进行一个判断操作,入队删除并且修改

image.png
image.png
本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 79.图像渲染
  • 80.岛屿数量
  • 81.岛屿的最大面积
  • 82.被围绕的区域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
附件炎吃什么药效果好 咳嗽吃什么药好 首长是什么意思 蝴蝶的翅膀像什么 父亲坐过牢对孩子有什么影响
伪善是什么意思 红斑狼疮吃什么药最好 胡萝卜什么时间种 嗯是什么意思 qa是什么
记性差是什么原因 开业需要准备什么东西 执业药师是干什么的 儿童哮喘挂什么科 十二月十号是什么星座
这是什么品牌 脑委缩有什么症状 VH是什么品牌 肉桂茶是什么茶 枕戈待旦什么意思
5.25是什么星座hcv9jop4ns7r.cn 什么颜色加什么颜色等于绿色hcv8jop7ns0r.cn 2000年是什么生肖hcv8jop6ns2r.cn 碱水对人有什么危害hcv8jop7ns6r.cn 鬼什么虎hebeidezhi.com
女生肚脐眼下面疼是什么原因hcv7jop9ns6r.cn 1月13日是什么星座hcv7jop9ns1r.cn 吃山竹有什么好处和坏处hcv8jop1ns6r.cn 抢沙发是什么意思hcv9jop0ns7r.cn 什么是亚麻籽油hcv8jop7ns4r.cn
一心向阳下一句是什么hcv8jop9ns4r.cn 百草霜是什么hcv9jop0ns3r.cn 李咏什么病hcv9jop4ns1r.cn 走路对身体有什么好处hcv7jop9ns1r.cn 支气管病变什么意思hcv9jop3ns4r.cn
什么红什么绿hcv8jop0ns3r.cn 整天犯困没精神想睡觉是什么原因hcv9jop3ns1r.cn 补钾用什么药mmeoe.com 精油是干什么用的hcv9jop7ns2r.cn 结婚6年是什么婚hcv7jop4ns5r.cn
百度