BFS 解决 FloodFill 算法
1. 图像渲染(medium)
题⽬描述:
有⼀幅以 m x n 的⼆维整数数组表⽰的图画 image ,其中 image[i][j] 表⽰该图画的像素值⼤⼩。
你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[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,因为它不是在上下左右四个⽅向上与初始点相连的像素点。
⽰例 2:
输⼊: image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, newColor = 2
输出: [[2,2,2],[2,2,2]]
算法思路:
可以利⽤「深搜」或者「宽搜」,遍历到与该点相连的所有「像素相同的点」,然后将其修改成指定的像素即可。

算法代码:
java
class Solution
{
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
public int[][] floodFill(int[][] image, int sr, int sc, int color)
{
int prev = image[sr][sc]; // 统计刚开始的颜⾊
if(prev == color) return image; // 处理边界情况
int m = image.length, n = image[0].length;
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{sr, sc});
while(!q.isEmpty())
{
int[] t = q.poll();
int a = t[0], b = t[1];
image[a][b] = color;
// 上下左右四个⽅向
for(int i = 0; i < 4; i++)
{
int x = a + dx[i], y = b + dy[i];
if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev)
{
q.add(new int[]{x, y});
}
}
}
return image;
}
}