leetcode 1162. 地图分析【BFS】

在本题中,海洋与陆地的距离可以等效为对陆地节点进行广度优先搜索,直到遇到海洋节点前所搜索的层数。
找出上述规律后,可用典型的队列实现对陆地节点的BFS了。不过这里有几点需要注意:

  1. 搜索的第一层应当是所有陆地节点,即对所有陆地节点同时展开搜索,这样最后一个被放入队列的节点就是距离陆地最远的海洋节点;
  2. 队列中存放的是海洋节点的坐标;
  3. 定义一个dir数组来简化对一个陆地节点的搜索;
  4. 将海洋节点放入队列前,将其数值改为2,这样海洋节点不会被重复放入队列。
class Solution {

    int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};

    public int maxDistance(int[][] grid) {
        int n = grid.length;
        Queue<int[]> q = new LinkedList<>();


        for(int i=0; i<n;i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1)q.offer(new int[]{i, j});
            }
        }

        if(q.size()==0 || q.size() == n*n){
            return -1;
        }

        int res=-1;
        while(!q.isEmpty()){
            res++;
            int len = q.size();
            for(int i=0; i<len; i++){
                int[] e = q.poll();
                int x = e[0];
                int y = e[1];

                for(int j=0; j<4; j++){
                    int newX = x + dir[j][0];
                    int newY = y + dir[j][1];
                    if(newX>=0 && newX <n && newY >=0 && newY <n && grid[newX][newY]==0){
                        grid[newX][newY] = 2;
                        q.offer(new int[]{newX, newY});
                    }
                }
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值