page contents

python基础编程100例:第72期-基础算法:广度优先搜索 图像渲染

本文讲述了python基础编程100例:第72期-基础算法:广度优先搜索 图像渲染!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-03-XheOFJ94624265bda15aa.png

本文讲述了python基础编程100例:第72期-基础算法:广度优先搜索 图像渲染!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

第72期-基础算法:广度优先搜索 图像渲染

1 问题描述

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

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

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

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


示例 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,

因为它不是在上下左右四个方向上与初始点相连的像素点。


初始代码


from typing import List

class Solution:

    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:

        #在此之间填写代码


print(Solution().floodFill([[1,1,1],[1,1,0],[1,0,1]],1,1,2))


2 解题思路

标签:广度优先搜索 / 深度优先搜索

首先找到初始节点,给它染色,这个初始节点当作第一层。

找到初始节点周围四个节点,给它们染色(符合条件的才能染),这四个节点当作第二层。

再找到这四个节点周围八个节点,给它们染色,这八个节点当作第三层。

重复以往,层层递进,直到找不到符合要求的节点。


3 解题方法

from typing import List

class Solution:

    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:

        a=image[sr][sc]

        if a==newColor:return image

        image[sr][sc]=newColor

        x=[(1,0),(0,1),(-1,0),(0,-1)]

        queue=[(sr,sc)]

        while queue:

            cur=queue.pop(0)

            for i in x:

                m,n=cur[0]+i[0],cur[1]+i[1]

                if 0<=m<len(image) and 0<=n<len(image[0]) and image[m][n]==a:

                    image[m][n]=newColor

                    queue.append((m,n))

        return image


print(Solution().floodFill([[1,1,1],[1,1,0],[1,0,1]],1,1,2))

第1-3,18行: 题目中已经给出的信息,运行代码时要根据这些代码进行编辑

第4行: 定义变量a用于存放初始坐标值

第5行: 当初始坐标值与要上色值相等时,直接返回原图

第6行: 若没有返回原图,也就是不相等时,将初始坐标先画成目标颜色

第7行: 定义列表x用于存放四个方向

第8行: 定义列表queue用于存放接下来需要遍历的坐标

第9行: 判断queue列表是否为空,若不为空则还有坐标需要遍历,继续循环

第10行: 定义坐标cur用于存放queue接下来需要使用的第一个坐标并从queue中删除该坐标

第11行: 使用for循环遍历上下左右四个方向

第12行: 定义变量m,n用于存放该方向的横竖坐标

第13行: 判断该点横竖坐标是否在矩阵内且该点颜色是否与初始点颜色相同

第14行: 若满足条件,将图中该方向的点颜色变为目标颜色

第15行: 在queue队列中加如带点坐标,用于之后该点扩散

第16行: 扩散完毕后,返回图


代码运行结果为:

attachments-2022-03-iBhN529762426583bc739.png


算法讲解

这里用到了基础算法:广度优先搜索,简单讲解下这个算法:

广度优先搜索

广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。

attachments-2022-03-JDR0mMJp6242656d97267.png

attachments-2022-03-S0S1JQbv62426566dbd26.png

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-GGK5QI1F629087edd8215.jpeg

  • 发表于 2022-03-29 09:50
  • 阅读 ( 410 )
  • 分类:Python开发

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章