思路(DFS):
我们从给定的起点开始,进行深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的颜色更新,以防止重复搜索;如果不相同,则进行回溯。
注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。
细节:
- 因为二维数组的行数n和列数m会被在原函数和dfs函数中都用到,所以定义为全局变量可以减少dfs的参数数量。
- 使用偏移数组简化代码,实现数组元素的移动
- 为了避免重复的涂色,需要将旧颜色保存下来,以便每一次的dfs做出条件判断是否是符合的涂色区域
具体实现
dsf代码实现:
public void dfs(int x, int y) {
if (img[x][y] == oldColor) {
img[x][y] = color;
for (int i = 0; i < 4; i++) {
int a = x + dx[i];
int b = y + dy[i];
if (a >= 0 && a < n && b >= 0 && b < m && img[a][b] != color) {
dfs(a, b);
}
}
}
}
实现代码(java)
class Solution {
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0 ,-1};
int[][] img;
int n , m;
int color;
int oldColor;
public void dfs(int x, int y) {
if (img[x][y] == oldColor) {
img[x][y] = color;
for (int i = 0; i < 4; i++) {
int a = x + dx[i];
int b = y + dy[i];
if (a >= 0 && a < n && b >= 0 && b < m && img[a][b] != color) {
dfs(a, b);
}
}
}
}
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
img = image;
n = image.length;
m = image[0].length;
color = newColor;
oldColor = img[sr][sc];
if (oldColor != newColor) {
dfs(sr, sc);
}
return img;
}