1. 程式人生 > >java學習(10):求最接近點對問題

java學習(10):求最接近點對問題

sta poi span exti ++ null @override over max

  1 import java.util.ArrayList;
  2 import java.util.Collections;
  3 import java.util.List;
  4 import java.util.Scanner;
  5 
  6 public class Main {
  7 
  8     public static void main(String[] args) {
  9         Scanner scanner = new Scanner(System.in);
 10         int N = -1;
 11         while
(N != 0) { 12 N = scanner.nextInt(); 13 List<Point> points = new ArrayList<>(); 14 for (int i = 0; i < N; i++) { 15 Point point = new Point(); 16 point.setX(scanner.nextDouble()); 17 point.setY(scanner.nextDouble());
18 points.add(point); 19 } 20 if(N!=0){ 21 double min = MinDistance(points); 22 System.out.printf("%.2f", min); 23 } 24 } 25 } 26 27 public static double MinDistance(List<Point> points) {
28 int n = points.size(); 29 if (n < 2) 30 return Integer.MAX_VALUE; 31 if (n == 2) { 32 double distance = Distance(points.get(0), points.get(1)); 33 return distance; 34 } 35 Collections.sort(points);// 將點按照x坐標排好 36 // 分界線為中間兩點x坐標的一半 37 double m = (points.get(points.size() / 2 - 1).getX() + points.get(points.size() / 2).getX()) / 2; 38 // 以x = m 為界限分為兩個點集 39 List<Point> leftPoints = new ArrayList<>(); 40 List<Point> rightPoints = new ArrayList<>(); 41 leftPoints.addAll(points.subList(0, points.size() / 2)); 42 rightPoints.addAll(points.subList(points.size() / 2, points.size())); 43 // 得到左右兩個點集的最短距離 44 double leftMin = MinDistance(leftPoints); 45 double rightMin = MinDistance(rightPoints); 46 47 // 得到最短距離 48 double min = Math.min(leftMin, rightMin); 49 50 // 創建P1點集和P2點集 51 List<Point> P1 = new ArrayList<>(); 52 List<Point> P2 = new ArrayList<>(); 53 for (Point point : points) { 54 if (point.getX() >= (m - min) && point.getX() < m) { 55 P1.add(point); 56 } 57 if (point.getX() > m && point.getX() <= m + min) { 58 P2.add(point); 59 } 60 } 61 62 double min2 = Integer.MAX_VALUE; 63 double distance; 64 boolean flag1, flag2; 65 if (P1 != null && P2 != null) { 66 for (Point point : P1) { 67 for (Point point2 : P2) { 68 flag1 = (point2.getY() >= (point.getY() - min) && point2.getY() <= point.getY()); 69 flag2 = (point2.getY() >= point.getY() && point2.getY() <= (point.getY() + min)); 70 if (flag1 || flag2) { 71 distance = Distance(point,point2); 72 if (distance < min2) { 73 min2 = distance; 74 } 75 76 } 77 } 78 } 79 return Math.min(min, min2); 80 } else { 81 return min; 82 } 83 } 84 85 public static double Distance(Point point1,Point point2){ 86 return Math.sqrt((point1.getX() - point2.getX()) * (point1.getX() - point2.getX()) 87 + (point1.getY() - point2.getY()) * (point1.getY() - point2.getY())); 88 } 89 } 90 91 class Point implements Comparable<Point> { 92 // 點的x.y坐標 93 private double x; 94 private double y; 95 96 public void setX(double x) { 97 this.x = x; 98 } 99 100 public void setY(double y) { 101 this.y = y; 102 } 103 104 public double getX() { 105 return x; 106 } 107 108 public double getY() { 109 return y; 110 } 111 112 @Override 113 public String toString() { 114 return "("+x+","+y+")"; 115 } 116 @Override 117 public int compareTo(Point o) { 118 if (x > o.getX()) 119 return 1; 120 else if (x == o.getX()) { 121 return 0; 122 } else { 123 return -1; 124 } 125 } 126 }

java學習(10):求最接近點對問題