# 【LeetCode】 733. Flood Fill
## Description
> An `image` is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535).
> Given a coordinate `(sr, sc)` representing the starting pixel (row and column) of the flood fill, and a pixel value `newColor`, "flood fill" the image.
> To perform a "flood fill", consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor.
> At the end, return the modified image.
> Note:
> * The length of `image` and `image[0]` will be in the range `[1, 50]`.
> * The given starting pixel will satisfy `0 <= sr < image.length and 0 <= sc < image[0].length`.
> * The value of each color in `image[i][j]` and `newColor` will be an integer in `[0, 65535]`.
> 一個`image`由一個二維的整數陣列所表示,每個整數代表圖像中像素點的值(0到65535)。
> 給予一個座標點`(sr, sc)`代表洪水填充的起始點(直排和橫列),和一個像素點的值`newColor`,請使用"洪水填充演算法"填補這個圖片。
> 要完成洪水填充法,從起始點開始,如果周圍四格相鄰的像素點和起始點是相同顏色的,將它們加入到起始點,並且再去加入和它們同樣顏色的鄰近點,如此不停做下去。用新的顏色替換掉前面提到的每個像素點。
> 最後,回傳修改後的圖像。
> 提示:
> * `image`的長度和`image[0]`的範圍落於`[1, 50]`。
> * 給予的起始點滿足`0 <= sr < image.length and 0 <= sc < image[0].length`。
> * `image[i][j]`和`newColor`的顏色的值會是整數並落於`[0, 65535]`的範圍中。
## Example:
```
Input:
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
Output: [[2,2,2],[2,2,0],[2,0,1]]
Explanation:
From the center of the image (with position (sr, sc) = (1, 1)), all pixels connected
by a path of the same color as the starting pixel are colored with the new color.
Note the bottom corner is not colored 2, because it is not 4-directionally connected
to the starting pixel.
```
## Solution
* 我們要做的洪水演算法基本上就是小畫家中"填充"的功能,可以用`DFS`或是`BFS`輕鬆完成。
* 由於`DFS`不須使用`queue`就可以實作,我們這邊使用`DFS`來完成。
* 要完成的事情就是檢查該點是否為相同顏色,如果是就遞迴去跑四周的格子。
* 記得檢查是否超出邊界。
* 記得檢查舊的顏色和新的顏色是否相同(如果相同就會變成無窮迴圈)。
### Code
```C++=1
class Solution {
public:
void DFS(vector<vector<int>>& image, int x, int y, int oldColor, int newColor)
{
if(image[y][x] == oldColor)
{
image[y][x] = newColor;
if(x > 0)
DFS(image, x - 1, y, oldColor, newColor);
if(x < image[0].size() - 1)
DFS(image, x + 1, y, oldColor, newColor);
if(y > 0)
DFS(image, x, y - 1, oldColor, newColor);
if(y < image.size() - 1)
DFS(image, x, y + 1, oldColor, newColor);
}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
if(image[sr][sc] == newColor)
return image;
DFS(image, sc, sr, image[sr][sc], newColor);
return image;
}
};
```
###### tags: `LeetCode` `C++`