package com.interview.flag.g;
import com.interview.leetcode.utils.Point;
import java.util.Arrays;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Set;
/**
* Created_By: stefanie
* Date: 14-12-31
* Time: 下午9:12
*/
public class G13_ChargeRobot {
class DistancePoint extends Point implements Comparable<DistancePoint>{
int distance;
public DistancePoint(int x, int y, Point[] points) {
super(x, y);
for(Point point : points){ //|x0-x1| + |y0-y1|.
distance += Math.abs(x - point.x) + Math.abs(y - point.y);
}
}
@Override
public int compareTo(DistancePoint o) {
return distance - o.distance;
}
}
public Point getPosition(Point[] machines){
Set<String> set = new HashSet<>();
for(int i = 0; i < machines.length; i++)
set.add(machines[i].x + "-" + machines[i].y);
Point center = minDistancePoint(machines);
PriorityQueue<DistancePoint> heap = new PriorityQueue<>();
while(set.contains(center.x + "-" + center.y)){
heap.add(new DistancePoint(center.x + 1, center.y, machines));
heap.add(new DistancePoint(center.x - 1, center.y, machines));
heap.add(new DistancePoint(center.x, center.y + 1, machines));
heap.add(new DistancePoint(center.x, center.y - 1, machines));
center = heap.poll();
}
return center;
}
private Point minDistancePoint(Point[] machines){
int[] xAxis = new int[machines.length];
int[] yAxis = new int[machines.length];
for(int i = 0; i < machines.length; i++){
xAxis[i] = machines[i].x;
yAxis[i] = machines[i].y;
}
return new Point(getMedian(xAxis), getMedian(yAxis));
}
private int getMedian(int[] numbers){
Arrays.sort(numbers);
if(numbers.length % 2 == 1){
return numbers[numbers.length / 2];
} else {
return (numbers[numbers.length / 2 - 1] + numbers[numbers.length/2])/2;
}
}
public static void main(String[] args){
Point[] machines = new Point[4];
machines[0] = new Point(1, 2);
machines[1] = new Point(2, 3);
machines[2] = new Point(3, 1);
machines[3] = new Point(1, 4);
G13_ChargeRobot placer = new G13_ChargeRobot();
Point position = placer.getPosition(machines);
System.out.println(position.x + "-" + position.y); //2-2
}
}