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 ;
}
}
}
}
}