一张image通过一个2-D整数数组来表示,每一个整数代表图片的像素值(从0到65535)。
给定一个坐标 (sr, sc) 代表洪水填充的起始像素(行和列),以及一个像素颜色newColor,“洪水填充”整张图片。
为了实现一个“洪水填充”,考虑起始像素点,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(同样和起始像素相同颜色),以此类推。把所以之前提到的像素点替换成新的颜色。
最终,返回修改后的图片。
样例 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方向相连。
思路:DFS,以起始点为中心向四周寻找符合条件的像素点,通过递归,将符合条件的像素点重新作为起始点,以此类推,从而得到答案。
class Solution {
public:
/**
* @param image: a 2-D array
* @param sr: an integer
* @param sc: an integer
* @param newColor: an integer
* @return: the modified image
*/
vector<vector<int>> floodFill(vector<vector<int>> &image, int sr, int sc, int newColor) {
// Write your code here
int num=image[sr][sc];
change(image,sr,sc,newColor, num);
return image;
}
void change(vector<vector<int>> &image, int sr, int sc, int newColor,int num)
{
int len1=image.size();
int len2=image[0].size();
if(sr<0||sr>=len1||sc<0||sc>=len2) return;
if(image[sr][sc]==num)
{
image[sr][sc]=newColor;
change(image,sr-1,sc,newColor,num);
change(image,sr+1,sc,newColor,num);
change(image,sr,sc-1,newColor,num);
change(image,sr,sc+1,newColor,num);
}
}
};