Zombie in Matrix

public class Solution {
    /**
     * @param grid: a 2D integer grid
     * @return: an integer
     */
		public int zombie(int[][] grid) {
			if (grid == null || grid.length == 0 || grid[0].length == 0) {
				return 0;
			}
		
			Queue<Integer> qx = new LinkedList<>();
			Queue<Integer> qy = new LinkedList<>();
			boolean[][] v = new boolean[grid.length][grid[0].length];
			
			for (int i = 0; i < grid.length; i++) {
				for (int j = 0; j < grid[0].length; j++) {
					if (grid[i][j] == 1) {
						qx.offer(i);
						qy.offer(j);
						v[i][j] = true;
					}
				}
			}
			
			int[] dx = {0, 0, 1, -1};
			int[] dy = {1, -1, 0, 0};
		
			int dist = 0;
			while (!qx.isEmpty()) {
				dist++;            //有元素在队列中,但不表示这一层中僵尸有食物 little sucker
				int size = qx.size();
				for (int i = 0; i < size; i++) {  //在dist++ 之后进行尝试
					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 (0 <= nx && nx < grid.length && ny >= 0 && ny < grid[0].length && grid[nx][ny] == 0 && !v[nx][ny]) {  //只看人 -- 只看有没走过
								qx.offer(nx);   //骑士问题可以在这里马上返回
								qy.offer(ny);
								v[nx][ny] = true;
							}
					}
				}
			}
			dist--;
			for (int i = 0; i < grid.length; i++) {
				for (int j = 0; j < grid[0].length; j++) {
					if (grid[i][j] == 0 && !v[i][j]) {
						return -1; //没被感染过
					}
				}
			}
			return dist;
		}
}

最后更新于

这有帮助吗?