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

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 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))
1
2
3
4
5
6

# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

第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行: 扩散完毕后,返回图

代码运行结果为:
image.jpg

# 算法讲解

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


树的广度优先遍历
image.jpg
图的广度优先遍历
image.jpg
树与图
image.jpg

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM