JS多源广度优先搜索

广度优先搜索
广度优先遍历是按层搜索,从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点所有未被访问的邻结点。访问完第一层后再访问第二层子节点,重复此方法,直到所有结点都被访问完为止。
在这里插入图片描述
对于图的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;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值