package com.interview.flag.g; import com.interview.leetcode.utils.Point; import java.util.*; /** * Created_By: stefanie * Date: 15-1-1 * Time: 下午2:20 */ public class G13_ChangingRobotII { public static final int SERVER = 1; public static final int OBSTACKLES = 2; public static final int EMPTY = 0; public Point getPosition(int[][] grid){ List<Point> machines = getMachinePositions(grid); int[][] distance = new int[grid.length][grid[0].length]; for(Point machine : machines){ calculateDistance(machine, grid, distance); } Point center = new Point(-1,-1); int minDis = Integer.MAX_VALUE; for(int i = 0; i < grid.length; i++){ for(int j = 0; j < grid[0].length; j++){ if(grid[i][j] == EMPTY && distance[i][j] != 0 && distance[i][j] < minDis){ minDis = distance[i][j]; center.x = i; center.y = j; } } } return center; } private List<Point> getMachinePositions(int[][] grid){ List<Point> machines = new ArrayList(); for(int i = 0; i < grid.length; i++){ for(int j = 0; j < grid[0].length; j++){ if(grid[i][j] == SERVER) machines.add(new Point(i, j)); } } return machines; } private int[][] calculateDistance(Point machine, int[][] grid, int[][] distance) { boolean[][] visited = new boolean[grid.length][grid[0].length]; Queue<Point> queue = new LinkedList(); queue.add(machine); visited[machine.x][machine.y] = true; int level = 0; while(!queue.isEmpty()){ int levelSize = queue.size(); for(int i = 0; i < levelSize; i++){ Point point = queue.poll(); distance[point.x][point.y] += level; enqueue(point.x + 1, point.y, grid, queue, visited); enqueue(point.x - 1, point.y, grid, queue, visited); enqueue(point.x, point.y + 1, grid, queue, visited); enqueue(point.x, point.y - 1, grid, queue, visited); } level++; } return distance; } private void enqueue(int x, int y, int[][] grid, Queue<Point> queue, boolean[][] visited){ if(x >= 0 && x < grid.length && y >= 0 && y < grid[0].length && !visited[x][y]){ visited[x][y] = true; if(grid[x][y] == EMPTY) queue.add(new Point(x, y)); } } public static void main(String[] args){ int[][] grid = new int[][]{ {EMPTY, SERVER, EMPTY, EMPTY, EMPTY, EMPTY}, {EMPTY, EMPTY, OBSTACKLES, OBSTACKLES, EMPTY, SERVER}, {OBSTACKLES, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY}, {EMPTY, EMPTY, SERVER, EMPTY, OBSTACKLES, EMPTY} }; G13_ChangingRobotII finder = new G13_ChangingRobotII(); Point center = finder.getPosition(grid); System.out.println(center.x + "-" + center.y); } }