【C++】BFS解决Floodfill问题

目录

Floodfill算法介绍

解决方法

BFS

图画渲染

算法思路:

代码实现:

岛屿数量

算法思路

代码实现

岛屿的最大面积 

算法思想

代码实现

被围绕的区域

算法思路

代码实现

总结:


Floodfill算法介绍

Floodfill翻译过来就是“洪水灌溉”;什么事洪水灌溉呢?先来看一幅图;

图中的数字代表的是陆地的高度,水往地处流,这里我们用负数代表低洼的区域,所以这个图中可以分为陆地和水域两种区域,水域是被陆地包裹着的;

洪水来了之后,绿色的部分就会被填充;

那么洪水来了之后,我们应该如何操作才能将低洼的地区填满(处理)呢?

解决方法

我们可以使用DFS和BFS来解决此类问题,本章博客我分享下BFS的解决方法;

BFS

BFS即Breadth First Search,即广度优先搜索。如果说DFS是一条路走到黑的话,BFS就完全相反了。BFS会在每个岔路口都各向前走一步。以二叉树为例;

与二叉树的层序遍历无出其右,一层一层的进行处理数据,每次只走一步;实现BFS的关键就是使用队列;

 BFS的代码实现其实也是有模版的,接下来我们来解决几道例题,心中自然就会明了了;

图画渲染

例题地址:. - 力扣(LeetCode)

算法思路:

这道题的思路很简单,题给出了一个初始的坐标,然后叫我们把这块区域周围与此坐标的值相等的连通区域改成目标颜色;
这里把image[sr][sv]赋值给pre;color是要更改的最终的颜色;
思路:如果给的pre处的颜色与要更改的颜色相同,那么就不需要操作;因为我们要更改的就是pre周围与他相同颜色的区域;如果pre处的颜色不是color,那么我们就需要通过BFS来把周围颜色与pre处相同的区域更改成color;
2.在floodfill函数中我们只需要调用一次BFS即可;
3.实现BFS算法:
a.传参我们需要把数组和坐标传过去,这道题还需要传递color;
b.m,n分别为数组中的行和列,用与边界的判断;
遍历技巧:定义两个数组dx和dy;这两个数组是用来就是遍历的,就下面的数组来看坐标x=a+dx[i],y=b+dy[i];进行四次遍历,dx,dy分别是(0,1)、(0,-1)、(1,0)、(-1,0)就是分别访问了以(a,b)为中心的上下左右四个方向;
visit数组是用来进行标记访问过区域的;因为有的情况前面访问过的区域还可能会被再次访问,为了避免这种情况我们需要进行标记;
c.因为我们之后要把pre处颜色更改,遍历需要与之前的颜色进行对比,所以我们使用tmp记下来pre处的颜色;如果pre处的颜色是color直接返回即可;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值