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<vector<int>> floodFill(vector<vector<int>>& 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<pair<int,int>> 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)//注意不可越界{q.push({x,y});}}}return image;}
};