题目来源:力扣
链接:力扣
var floodFill = function(image, sr, sc, newColor) {
let imagewight = image[0].length;
let imageHeight = image.length;
let oldcolor = image[sr][sc];
// 如果这个位置的颜色与新颜色一样这个image就不需要做出改变
if(oldcolor == newColor){
return image;
}
// 广度优先搜索
// 第一步:将初始坐标入列
const queue = [[sr,sc]];
// 如果quesr的长度为0表示所有数据都出列了,即所有符合条件的位置都改变颜色了
while(queue.length){
// 将这个数据出列即删除这个数组的第一个数据,即要满足队列的特性,
// 且将这个值赋给[i,j],从这个位置上下左右扩展
const [i,j] = queue.shift();
// 这个数据出列之后就给他变色(如果不满足条件是不会入列的)
image[i][j] = newColor;
// 按上下左右四个方向
// 如果是减法就要判断是否比0小,如果是加法就要判断是否比数组长度还大
// 即判断数据是否出界
// 如果不出界,就开始判断这个位置的数据是否符合题意,如果符合就把这个位置入列
if(i-1>=0 && image[i-1][j]== oldcolor){
queue.push([i-1,j]);
}
if(i+1<imageHeight && image[i+1][j]== oldcolor){
queue.push([i+1,j]);
}
if(j-1>=0 && image[i][j-1]== oldcolor){
queue.push([i,j-1]);
}
if(j+1<imagewight && image[i][j+1]== oldcolor){
queue.push([i,j+1]);
}
}
return image;
};
广度优先搜索的主要思想就是将某一点位作为起始点访问所有可以直接到达的点位,然后对这些点位再访问它们可以直接到达的点位,直到所有的点位都被访问完毕。
广度优先搜索一般与队列相结合(队列就是只允许在一端进行插入操作而在另一端进行删除操作,可以参考排队~)