题目来源:力扣
链接:力扣
var floodFill = function(image, sr, sc, newColor) {
let imagewight = image[0].length;
let imageHeight = image.length;
let oldcolor = image[sr][sc];
if(oldcolor == newColor){
return image;
}
// 深度优先搜索(用到了递归)
let search = (i, j) => {
// 判断是否到达临界点,如果到了就结束循环
if (i < 0 || i >= imageHeight || j < 0 || j >= imagewight || image[i][j] != oldcolor) {
return false;
}
// 将符合的位置改变颜色
image[i][j] = newColor;
// 每个传入的点位都会向四个方向一直走
// 这个递归函数会一直向上走,直到到达边界或者颜色不符合要求
search(i - 1, j);
// 这个递归函数会一直向下走,直到到达边界或者颜色不符合要求
search(i + 1, j);
// 这个递归函数会一直向左走,直到到达边界或者颜色不符合要求
search(i, j - 1);
// 这个递归函数会一直向右走,直到到达边界或者颜色不符合要求
search(i, j + 1);
};
// 调用这个函数,将初始位置传进去
search(sr, sc);
return image;
};
深度优先:从起始点位开始对每一个可能的分支进行搜索直到分支结束,在这期间对每一个到达的点位都进行它的分支搜索直到临界点,注意不要重复搜索。(有点不撞南墙不回头的意思)
深度优先搜索一般结合递归使用,递归:程序调用自身的编程技巧,通俗点说就是自己调用自己,但是要注意递归需要有结束判断,不然会陷入死循环。