题目 图像渲染
题目解析
给出一个矩阵:
[[1,1,1],
[1,1,0],
[1,0,1]]
给出一个坐标(1,1)和新数值(2)
要求:把坐标及其周围的旧数值变为新数值,即新矩阵为:
[[2,2,2],
[2,2,0],
[2,0,1]]
ps:和岛屿数量有点像
思路
采用BFS
从image[sr,sc](记位p)出发,向四周访问
若访问点满足未被访问且值与p相同,则将其渲染并从该点再向四周继续访问
本题要点
(1)在出队后,拓展前,改变当前结点信息,即访问记录和渲染值
(2)在拓展结点时,判断该结点是否满足加入队列条件
AC代码
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
if(image[sr][sc] == newColor)//如果颜色相同直接返回
return image;
int ori = image[sr][sc];
int row = image.size();
int col = image[0].size();
queue<pair<int,int>>que;//待访问队列
vector<vector<bool>>visited(row,vector<bool>(col,false));//访问记录
int dx[4] = {-1,0,1,0};//行方向
int dy[4] = {0,1,0,-1};//列方向
que.push(make_pair(sr,sc));
while(!que.empty()){
int x = que.front().first;
int y = que.front().second;
que.pop();
if(visited[x][y] == false && image[x][y] == ori){//判断是否属于周围旧数字
//改变当前结点信息
visited[x][y] = true;
image[x][y] = newColor;
//向四周拓展
for(int k = 0; k < 4; k++){
int xx = x + dx[k];
int yy = y + dy[k];
if(xx >= 0 && yy >= 0 && xx < row && yy < col){
if(visited[xx][yy] == false && image[xx][yy] == ori)
que.push(make_pair(xx,yy));//满足条件加入队列,等待访问
}
}
}
}
return image;
}
};