广度优先搜索
广度优先遍历是按层搜索,从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点所有未被访问的邻结点。访问完第一层后再访问第二层子节点,重复此方法,直到所有结点都被访问完为止。
对于图的BFS也是一样滴~ 与Tree的BFS区别如下:
1、tree只有1个root,而图可以有多个源点,所以首先需要把多个源点都入队。
2、tree是有向的因此不需要标志是否访问过,而对于无向图来说,必须得标志是否访问过!
并且为了防止某个节点多次入队,需要在入队之前检查是否标志过已访问!
地图分析题
这是一道典型的BFS基础应用,为什么这么说呢?
因为我们只要先把所有的陆地都入队,然后从各个陆地同时开始一层一层的向海洋扩散,那么最后扩散到的海洋就是最远的海洋!
并且这个海洋肯定是被离他最近的陆地给扩散到的!
下面是扩散的图示,1表示陆地,0表示海洋。每次扩散的时候会标记相邻的4个位置的海洋:
作者:sweetiee
链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible/solution/jian-dan-java-miao-dong-tu-de-bfs-by-sweetiee/
来源:力扣(LeetCode)
将初始陆地坐标放进队列,然后逐次取出队列坐标,判断其上下左右是否有海洋,有则将海洋的值改为1,放进队列,第一轮结束后距离加1;之后每轮都是一样的操作,直至队列没有元素.
var maxDistance = function(grid) {
let [ queue_1, maxDistance] = [ [], -1]
for(let i = 0; i < grid.length; i++){
for(let j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1)
queue_1.push([i, j])
}
}
if(queue_1.length == (0 || (grid.length*grid[0].length))) return -1
while(queue_1.length != 0){
let len = queue_1.length;//记住要搜索的这层的节点个数
for(let k = 0; k < len; k++){
let [i1, j1] = queue_1.shift();
if(i1 > 0 && grid[i1-1][j1] == 0){
grid[i1-1][j1] = 1;
queue_1.push([i1-1,j1]);
}
if(i1 < grid.length - 1 && grid[i1+1][j1] == 0){//判断边界条件,且是否没有被标记过
grid[i1+1][j1] = 1;
queue_1.push([i1+1,j1]);
}
if(j1 > 0 && grid[i1][j1-1] == 0){
grid[i1][j1-1] = 1;
queue_1.push([i1,j1-1]);
}
if(j1 < grid[0].length - 1 && grid[i1][j1+1] == 0){
grid[i1][j1+1] = 1;
queue_1.push([i1,j1+1]);
}
}
maxDistance++;
}
return maxDistance;
};