題目串連:10245 - The Closest Pair Problem
題目大意:給出若干個點,找出兩個點,使得兩點間距離為所有任意兩點距離中的最小值。
解題思路:本來這題應該用分治的方法去做的,但是偷了點懶,暴力剪枝過了,剪枝的方法就是將所有點按照x的大小來排序,當point[j].x - point[i].x > min(min 為當前找到的最小值),可以跳出迴圈,開始判斷i+ 1點。
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;const int N = 100010;struct point { double x; double y;}p[N];bool cmp(const point &a, const point &b) { return a.x < b.x;}double getDist(point a, point b) { double tmpx = (a.x - b.x) * (a.x - b.x); double tmpy = (a.y - b.y) * (a.y - b.y); return sqrt(tmpx + tmpy);}int main() { int n; double Min, dist; while (scanf("%d", &n), n) {memset(p, 0, sizeof(p));Min = 0XFFFFFFF;for (int i = 0; i < n; i++) scanf("%lf %lf", &p[i].x, &p[i].y);sort(p, p + n, cmp);for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) {if (fabs(p[i].x - p[j].x) - Min > 1e-9) break;dist = getDist(p[i], p[j]);if (Min - dist > 1e-9) Min = dist; }}if (Min - 10000 > 1e-9) printf("INFINITY\n");else printf("%.4lf\n", Min); } return 0;}