前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 733. 图像渲染(DFS/BFS)

LeetCode 733. 图像渲染(DFS/BFS)

作者头像
Michael阿明
发布2020-07-13 15:20:23
5110
发布2020-07-13 15:20:23
举报

1. 题目

有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。

给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。

为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。

最后返回经过上色渲染后的图像。

代码语言:javascript
复制
示例 1:

输入: 
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
输出: [[2,2,2],[2,2,0],[2,0,1]]
解析: 
在图像的正中间,(坐标(sr,sc)=(1,1)),
在路径上所有符合条件的像素点的颜色都被更改成2。
注意,右下角的像素没有更改为2,
因为它不是在上下左右四个方向上与初始点相连的像素点。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/flood-fill 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

要求跟初始位置颜色一样的,相邻都的改颜色(跟朋友圈,岛屿那几题一样)

2.1 DFS

代码语言:javascript
复制
class Solution {
	int oldCol;
	int r,c;
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        oldCol = image[sr][sc];
        r = image.size();
        c = image[0].size();
        vector<vector<bool>> visited(r,vector<bool> (c,false));
        dfs(image, sr, sc, newColor,visited);
        return image;
    }
    void dfs(vector<vector<int>> &image, int sr, int sc, int &newColor, vector<vector<bool>> &visited)
    {
    	if((sr<0 || sr>=r)||(sc<0 || sc>=c))
    		return;
    	if(image[sr][sc] == oldCol && !visited[sr][sc])
    	{
    		image[sr][sc] = newColor;
    		visited[sr][sc] = true;
    		dfs(image, sr-1, sc, newColor,visited);
    		dfs(image, sr+1, sc, newColor,visited);
    		dfs(image, sr, sc-1, newColor,visited);
    		dfs(image, sr, sc+1, newColor,visited);
    	}
    }
};
在这里插入图片描述
在这里插入图片描述

2.2 BFS

代码语言:javascript
复制
class Solution {
	int oldCol;
	int r,c;
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        oldCol = image[sr][sc];
        r = image.size();
        c = image[0].size();
        vector<vector<bool>> visited(r,vector<bool> (c,false));
        vector<vector<int>> dir = {{0,1},{0,-1},{1,0},{-1,0}};
        queue<pair<int,int>> q;
        q.push({sr,sc});
        int xf, yf, x, y, i;
        visited[sr][sc] = true;
        while(!q.empty())
        {
        	xf = q.front().first;
        	yf = q.front().second;
        	image[xf][yf] = newColor;
        	q.pop();
        	for(i = 0; i < 4; ++i)
        	{
        		x = xf+dir[i][0];
        		y = yf+dir[i][1];
        		if((x>=0 && x<r)&&(y>=0 && y<c) && !visited[x][y] && image[x][y] == oldCol)
	        	{
	        		q.push({x,y});
	        		visited[x][y] = true;
	        		//不能在这里改颜色,改了,他一会不能找到他的邻居了,!= oldcolor
	        	}
        	}  	
        }
        return image;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
    • 2.1 DFS
      • 2.2 BFS
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档