本文主要是介绍FloodFill算法——图像渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 题目解析
- 题目内容解读
- 算法解析
- 代码解析
题目解析
首先我们先来看看题目:图像渲染
题目内容解读
我们来解读一下题目内容这个题目的意思其实就是有一个如下图所示的二维矩阵
这个题目的意思在这类题目中也是非常标准的,就是给我们一个二维数组然后会再给我们一个坐标要求是我们以这个坐标为起点向四周延申,在这个过程中只有等于我们初始坐标这个值然后让这些值赋值为题目要求的值即可
算法解析
面对这个题目其实我们有两种解决思路,第一种就是BFS,第二种就是DFS,而我们现在讲的是BFS算法,那么BFS应该怎么办呢?我们可以,以题目要求的坐标为七点向四周延申,在延深过程中,我们只需要对每个符合要求的节点设置一个标志表明不会连续访问这个节点两次即可。那么有了这个思路我们的代码应该怎么办呢
?
代码解析
class Solution {
public:int dx[4]={0,-1,0,1};int dy[4]={1,0,-1,0};typedef pair<int,int>PII;vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {int prev=image[sr][sc];int m=image.size();int n=image[0].size();queue<PII>q;q.push({sr,sc});if(prev==color){return image;//当题目要求设置的颜色跟我们初始位置的颜色相同的时候直接返回image即可。因为//可以转换的是跟新的颜色值相同的位置,而不可以转换的无论其与color是否相同其实都没有影响了。}while(q.size()){//宽搜的老朋友队列登场auto[a,b]=q.front();q.pop();image[a][b]=color;for(int i=0;i<4;i++){//从这个节点位置向四周延深int x=a+dx[i];int y=b+dy[i];if(x<m&&y<n&&x>=0&&y>=0&&image[x][y]==prev){//当遍历到的这个位置等于初始节点的位置的值的时候就将其放入队列。q.push({x,y});}}}return image;}
};
从上面对于算法的解析种我们其实应该是对每一个遍历到的节点加一个标志位的但是这个题目不用因为这个题目的主要要求是,符合条件的节点的值全部转换为题目要求的值因此我们可以发现即使没有标记位只需要记录初始位置的值然后逐个匹配即可。
这篇关于FloodFill算法——图像渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!