问题描述:
描述
一张image通过一个2-D整数数组来表示,每一个整数代表图片的像素值(从0到65535)。
给定一个坐标 (sr, sc) 代表洪水填充的起始像素(行和列),以及一个像素颜色newColor,“洪水填充”整张图片。
为了实现一个“洪水填充”,考虑起始像素点,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(同样和起始像素相同颜色),以此类推。把所以之前提到的像素点替换成新的颜色。
最终,返回修改后的图片。
image 和 image[0]的长度会在[1, 50]范围内。
给定的起始像素点会满足 0 <= sr < image.length 和 0 <= sc < image[0].length。
image[i][j]的每一中颜色值和newColor 会是在 [0, 65535]内的整数。
输出样例:
样例 1:
输入:
image = [[1,1],[0,0]]
sr = 0, sc = 0, newColor = 2
输出: [[2,2],[0,0]]
样例 2:
输入:
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]]
解释:
从图片的中心(坐标为(1, 1)),所有和起始像素通过相同颜色相连的像素上成了新的颜色。
注意底下的角落没有被染成2,因为它和起始像素不是4方向相连。
分析:
根据题目描述和样例输出可以总结出来:我们需要将二维数组中心值image[sr][sc]的颜色变成newColor,然后从中心值开始的四个方向也进行newColor的填充;但是4方向的初始值要和中心处的初始值相同的时候才进行4方向的填充,否则就不进行填充了
解决方案:
由于每次都是做相同的操作,所以我第一个想法就是使用递归求解;
先确认递归的结束条件:1.sr代表的是横向坐标(image的长度),后面用x代替,sc代表的是纵向坐标(image[0]的长度),后面用y代替;所以sr<0或者sc<0或者sr>=x或者sc>=y时递归会结束 2.如果四方向的初始值和中心值不同递归结束;给出代码:
public class Solution {
/**
* @param image: a 2-D array
* @param sr: an integer
* @param sc: an integer
* @param newColor: an integer
* @return: the modified image
*/
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
// Write your code here
int color=image[sr][sc];
fill(image,sr,sc,newColor,color);
return image;
}
public void fill(int[][] image, int sr, int sc, int newColor,int startColor){
int x=image.length;
int y=image[0].length;
if(sr<0 || sc <0 || sr>=x || sc>=y || image[sr][sc] == newColor || startColor!=image[sr][sc]){
return;
}
image[sr][sc]=newColor;
fill(image,sr+1,sc,newColor,startColor);
fill(image,sr-1,sc,newColor,startColor);
fill(image,sr,sc+1,newColor,startColor);
fill(image,sr,sc-1,newColor,startColor);
}
}
AC结果: