package com.interview.flag.g;
import com.interview.utils.ConsoleWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/**
* Created_By: stefanie
* Date: 15-1-26
* Time: 下午4:27
*/
public class G31_MinDistanceForPolice {
public static final int CLOSED = 1;
public static final int OPENED = 0;
public static final int POLICE = 2;
public int[][] minDistance(int[][] grid){
int[][] distance = new int[grid.length][grid[0].length];
for(int i = 0; i < distance.length; i++) Arrays.fill(distance[i], Integer.MAX_VALUE);
Queue<Integer> queue = new LinkedList();
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == POLICE){
distance[i][j] = 0;
queue.offer(i * grid[0].length + j);
}
}
}
BFSVisit(grid, distance, queue);
return distance;
}
private void BFSVisit(int[][] grid, int[][] distance, Queue<Integer> queue){
int cols = grid[0].length;
int step = 0;
while(!queue.isEmpty()){
int queueSize = queue.size();
for(int k = 0; k < queueSize; k++){
int position = queue.poll();
int i = position / cols;
int j = position % cols;
distance[i][j] = step;
enqueue(queue, i + 1, j, grid, distance);
enqueue(queue, i - 1, j, grid, distance);
enqueue(queue, i, j + 1, grid, distance);
enqueue(queue, i, j - 1, grid, distance);
}
step++;
}
}
private void enqueue(Queue<Integer> queue, int i, int j, int[][] grid, int[][] distance) {
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length
|| grid[i][j] == CLOSED || distance[i][j] != Integer.MAX_VALUE) return;
queue.offer(i * grid[0].length + j);
}
public static void main(String[] args){
G31_MinDistanceForPolice calculator = new G31_MinDistanceForPolice();
int[][] houses = new int[][]{
{1,0,0,2,0,0,1,2},
{0,1,0,1,0,0,0,0},
{1,0,0,1,0,0,1,0}
};
int[][] distance = calculator.minDistance(houses);
ConsoleWriter.printIntArray(distance);
// {~,2,1,0,1,2,~,0},
// {~,~,2,~,2,3,2,1},
// {~,4,3,~,3,4,~,2}
}
}