Walls and Gates

class Solution {
		public void wallsAndGates(int[][] rooms) {
				if (rooms == null || rooms.length == 0 || rooms[0].length == 0) return;
				
				Queue<Integer> qx = new LinkedList<>();
				Queue<Integer> qy = new LinkedList<>();
				boolean[][] visited = new boolean[rooms.length][rooms[0].length];
		
				for (int i = 0; i < rooms.length; i++) {
					for (int j = 0; j < rooms[0].length; j++) {
						if (rooms[i][j] == 0) {
							qx.offer(i);
							qy.offer(j);
							visited[i][j] = true;
						}
					}
				}
				
				int level = 0;
				while (!qx.isEmpty()) {
					level++;
					int size = qx.size();
					for (int i = 0; i < size; i++) {
						int cx = qx.poll();
						int cy = qy.poll();
						bfs(rooms, cx, cy, visited, level, qx, qy);
					}
				}
		}
		private void bfs(int[][] rooms, int x, int y, boolean[][] visited, int level, Queue<Integer> qx, Queue<Integer> qy) {
			int[] dx = {0, 0, 1, -1};
			int[] dy = {1, -1, 0, 0};
		
			Queue<Integer> _qx = new LinkedList<>();
			Queue<Integer> _qy = new LinkedList<>();
			
			_qx.offer(x);
			_qy.offer(y);
				
			while (!_qx.isEmpty()) {
				int cx = _qx.poll();
				int cy = _qy.poll();
				for (int k = 0; k < 4; k++) {
					int nx = cx + dx[k];
					int ny = cy + dy[k];
					if (nx >= 0 && ny >= 0 && nx < rooms.length && ny < rooms[0].length && !visited[nx][ny] && rooms[nx][ny] != -1) {
						visited[nx][ny] = true;
						rooms[nx][ny] = level;
						qx.add(nx);
						qy.add(ny);
					}
				}
			}
		}
}

最后更新于

这有帮助吗?