前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员面试金典 - 面试题 08.10. 颜色填充(BFS/DFS)

程序员面试金典 - 面试题 08.10. 颜色填充(BFS/DFS)

作者头像
Michael阿明
发布2020-07-13 16:42:25
4010
发布2020-07-13 16:42:25
举报

1. 题目

颜色填充。编写函数,实现许多图片编辑软件都支持的“颜色填充”功能。

给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全都改变。

代码语言: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,
因为它不是在上下左右四个方向上与初始点相连的像素点。

说明:
image 和 image[0] 的长度在范围 [1, 50] 内。
给出的初始点将满足 0 <= sr < image.length 和 0 <= sc < image[0].length。
image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535]内。

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

2. 解题

  • 标准的广度和深度优先搜索,模板题

2.1 BFS

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        int m = image.size(), n = image[0].size();
        int original = image[sr][sc], k, x, y, x0, y0;
        vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
        queue<vector<int>> q;
        vector<vector<bool>> visited(m, vector<bool>(n,false));
        q.push({sr,sc});
        visited[sr][sc] = true;
        image[sr][sc] = newColor;
        while(!q.empty())
        {
        	x0 = q.front()[0];
        	y0 = q.front()[1];
        	q.pop();
        	for(k = 0; k < 4; ++k)
        	{
        		x = x0+dir[k][0];
        		y = y0+dir[k][1];
        		if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && image[x][y]==original)
        		{
        			q.push({x,y});
        			visited[x][y] = true;
        			image[x][y] = newColor;
        		}
        	}
        }
        return image;
    }
};
在这里插入图片描述
在这里插入图片描述

2.2 DFS

代码语言:javascript
复制
class Solution {
	vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
	int m, n, original;
	vector<vector<bool>> visited;
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        m = image.size(), n = image[0].size();
        original = image[sr][sc];
        visited.resize(m, vector<bool>(n,false));
        visited[sr][sc] = true;
        image[sr][sc] = newColor;
        dfs(image,sr,sc,newColor);
        return image;
    }

    void dfs(vector<vector<int>>& image, int x0, int y0, int newColor)
    {
    	int x, y;
    	for(int k = 0; k < 4; ++k)
    	{
    		x = x0+dir[k][0];
    		y = y0+dir[k][1];
    		if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && image[x][y]==original)
    		{
    			visited[x][y] = true;
    			image[x][y] = newColor;
    			dfs(image,x,y,newColor);
    			//占领即可,不必回溯
    		}
    	}
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
    • 2.1 BFS
      • 2.2 DFS
      相关产品与服务
      图片处理
      图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档