UVA - 10245 The Closest Pair Problem

题目大意:给出若干个点,找出两个点,使得两点间距离为所有任意两点距离中的最小值。


解题思路:本来这题应该用分治的方法去做的,但是偷了点懒,暴力剪枝过了,剪枝的方法就是将所有点按照x的大小来排序,当point[j].x - point[i].x > min(min 为当前找到的最小值),可以跳出循环,开始判断i+ 1点。

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

struct Node{
	double x;
	double y;
} node[10005];

int cmp(Node a, Node b) {
	return a.x < b.x;
}

int main() {
	int N;
	while (scanf("%d", &N), N) {
		for (int i = 0; i < N; i++)
			scanf("%lf%lf", &node[i].x, &node[i].y);
		sort(node, node + N, cmp);
		double min = 10001;
		for (int i = 0; i < N; i++)
			for (int j = i + 1; j < N && node[j].x - node[i].x < min; j++) {
				double X = node[j].x - node[i].x;
				double Y = node[j].y - node[i].y;
				double temp = sqrt(X * X + Y * Y);
				if (temp < min)
					min = temp;
			}
		min >= 10000 ? printf("INFINITY\n") : printf("%.4lf\n", min);
	}
	return 0;
}

UVA - 10245

The Closest Pair Problem

你可能感兴趣的:(UVA - 10245 The Closest Pair Problem)