深入解析:BFS与FloodFill算法简介与实战
FloodFill(洪水灌溉)算法,我们一般用以下情景模拟:假设我们有一个二维数组,每一个元素代表其高度(正负表示低于/高于水平面),假设现在从四面八方来了洪水,问哪些元素代表的区域先被水覆盖,很明显,需要低于水平面才能满足要求而且必须周围都要低于水平面。因此FF算法的本质是找性质相同的联通块。
而BFS(深度优先算法),是从层序遍历的角度来查找是否有符合的区域。除此之外还有DFS(深度优先算法)采用一条路走到黑的方法来寻找,本篇我们咱不说后者。
实战模拟——图像渲染
我们先从标记点开始渲染,然后分别渲染其上下左右,然后分别以其为中心继续渲染。
关于细节我们写在下面的代码中。
class Solution {
public:
int dx[4]={0,0,1,-1};//dx,dy数组用于枚举某一坐标的上下左右
int dy[4]={1,-1,0,0};//每一个坐标分别加两个数组的元素即可得到相邻的位置
vector> floodFill(vector>& image, int sr, int sc, int color) {
int prev=image[sr][sc];
if(prev==color) return image;//染色相同则不需要染
int m=image.size(),n=image[0].size();
queue> q; //用队列储存还没进行染色的相邻符合区域
q.push({sr,sc});
while(q.size())
{
auto [a,b]=q.front();//染色后就取出
q.pop();
image[a][b]=color;
for(int i=0;i=0&&x=0&&y