# 0286. Walls and Gates ###### tags: `Leetcode` `Medium` `BFS` Link: https://leetcode.com/problems/walls-and-gates/ ## 思路 BFS 但是很巧妙的一点是这次BFS在开头的时候把所有的gate都加进去 这样算出的结果都是最短距离 (不需要用层序遍历,因为每个neighbor的值都是curr pos的值+1,已经是层序遍历了~) ## Code ```java= class Solution { private static final int EMPTY = Integer.MAX_VALUE; private static final int GATE = 0; private static final int[][] directions = new int[][] {{-1,0},{1,0},{0,-1},{0,1}}; public void wallsAndGates(int[][] rooms) { Queue<int[]> q = new LinkedList<>(); for(int i = 0;i < rooms.length;i++){ for(int j = 0;j < rooms[0].length;j++){ if(rooms[i][j] == GATE){ q.add(new int[]{i,j}); } } } while(!q.isEmpty()){ int[] curr = q.poll(); List<int[]> nextPos = getNext(curr, rooms.length, rooms[0].length, rooms); for(int[] next:nextPos){ rooms[next[0]][next[1]] = rooms[curr[0]][curr[1]]+1; q.add(next); } } return; } public List<int[]> getNext(int[] curr, int m, int n, int[][] rooms){ List<int[]> res = new ArrayList<>(); for(int i = 0;i < directions.length;i++){ int newRow = curr[0]+directions[i][0]; int newCol = curr[1]+directions[i][1]; if(newRow<0 || newRow>=m || newCol<0 || newCol>=n || rooms[newRow][newCol]!=EMPTY){} else{ res.add(new int[]{newRow, newCol}); } } return res; } } ```