663 · 墙和门

本文介绍了一种解决二维网格中每个空房间到最近门的最短距离问题的算法。该算法采用广度优先搜索策略从所有门开始遍历,并更新每个空房间到最近门的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

663 · 墙和门

描述
您将获得一个使用这三个可能值初始化的 m×n 2D 网格。
-1 - 墙壁或障碍物。
0 - 门。
INF - Infinity是一个空房间。我们使用值 2 ^ 31 - 1 = 2147483647 来表示INF,您可以假设到门的距离小于 2147483647。
在代表每个空房间的网格中填入到距离最近门的距离。如果不可能到达门口,则应填入 INF。

样例
样例1

输入:
[[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]]
输出:
[[3,-1,0,1],[2,2,1,-1],[1,-1,2,-1],[0,-1,3,4]]
解释:
2D网络为:
INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
答案为:
3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4

public class Solution {
    /**
     * @param rooms: m x n 2D grid
     * @return: nothing
     */
    static final int INF = 2147483647 ;
    int n , m ;
    public void wallsAndGates(int[][] rooms) {
        // write your code here
        n = rooms.length ;
        if(rooms == null || n == 0){
            return  ;
        }
        m = rooms[0].length ;
        int[] dx = {0 , 1 , 0 , -1} ;
        int[] dy = {1 , 0 , -1 , 0} ;
        Queue<Integer> qx = new LinkedList<>();
        Queue<Integer> qy = new LinkedList<>();
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                if(rooms[i][j] == 0){
                     qx.add(i);
                     qy.add(j);
                }
               
            }
        }
        while(! qx.isEmpty()){
            int ox = qx.poll() ;
            int oy = qy.poll() ;
            for(int i = 0 ; i < 4 ; i++){
                int nx = ox + dx[i] ;
                int ny = oy + dy[i] ;
                if(nx < 0 && nx >= n && ny < 0 && ny >= m){
                    continue ;
                }
                if(nx >= 0 && nx < n && ny >= 0 && ny < m && rooms[nx][ny] == INF){
                    qx.add(nx) ;
                    qy.add(ny) ;
                    rooms[nx][ny] = rooms[ox][oy] + 1 ;
                }
            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值