题目的链接在这里:https://leetcode-cn.com/problems/flood-fill/
题目大意
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
一、示意图
二、解题思路
BFS和DFS
BFS
代码如下:
class Solution {
int[] stepX={0,0,1,-1};
int[] stepY={1,-1,0,0};
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
//sr sc是图像开始的像素值 newColor是新的颜色值
//把初始坐标 上下左右上的像素值和初始坐标上的像素点 也就是把和初始坐标值一样的值 都改成对应的颜色
//首先是使用BFS和队列
//先让他进队列 并且进行标
int flag=image[sr][sc];
boolean[][] isVisited =new boolean[image.length][image[0].length];
//先把这个值更新了
image[sr][sc]=newColor;
//设置为访问过了
isVisited[sr][sc]=true;
//然后把和他有关的上下左右 满足条件的全都进队列 记录左边 那就取前两个吧
Queue<Integer> queue=new LinkedList<>();
//入队列
queue.add(sr);
queue.add(sc);
while (!queue.isEmpty()){
//记录这一层的个数 这里需要注意的是 应该是需要除以二的 因为一次是拿出来两个
//应该是这里即时记录
int size=queue.size()/2;
for(int i=0;i<size;i++){
//取出当前的值 先进队列的是行
int x=queue.poll();
int y=queue.poll();
//然后判断他的四周
for(int j=0;j<4;j++){
int newX=x+stepX[j];
int newY=y+stepY[j];
//然后判断是否满足条件 还需要防止回滚 设置一个访问数组
if(newX>=0&&newX<image.length&&newY>=0&&newY<image[0].length&&image[newX][newY]==flag&&!isVisited[newX][newY]){
//没有越界并且这个值是满足条件的 并且没有访问过 那就进行修改 并且放入栈中
image[newX][newY]=newColor;
queue.add(newX);
queue.add(newY);
//设置成访问过了
isVisited[newX][newY]=true;
}
}
}
}
return image;
}
}
DFS
代码如下:
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
//使用DFS来实现
boolean[][] isVisited=new boolean[image.length][image[0].length];
int flag=image[sr][sc];
//然后就可以开始dfs了
DFS(image,sr,sc,newColor,flag,isVisited);
return image;
}
private static void DFS(int[][] image, int sr, int sc, int newColor, int flag, boolean[][] isVisited) {
//先是结束条件 直接判断符不符合条件
if(sr<0||sr>=image.length||sc<0||sc>=image[0].length||isVisited[sr][sc]||image[sr][sc]!=flag){
//只要有一个条件不满足 直接返回
return;
}
//那就说明这个条件是满足的 应该是可以直接修改吧
image[sr][sc]=newColor;
//并设置这个值是访问过的
isVisited[sr][sc]=true;
//然后DFS遍历他的四周
DFS(image,sr+1,sc,newColor,flag,isVisited);
DFS(image,sr-1,sc,newColor,flag,isVisited);
DFS(image,sr,sc+1,newColor,flag,isVisited);
DFS(image,sr,sc-1,newColor,flag,isVisited);
}
}