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 }