设是平面上散列的个点的集合。请编写程序找出集合中距离最近的点对的距离。 输入格式: 输入第一行给出一个正整数,表示平面上点的数量。随后行,每行给出一个实数对,每个实数对表示一个点的坐标值,其中第1数表示横坐标,第2数表示纵坐标。 输出格式: 最近点对中两个点之间的距离。。编写c++代码
时间: 2024-03-16 14:47:06 浏览: 47
用c++编写一个程序,设计一个点类Point,求两个点之间的距离。
5星 · 资源好评率100%
以下是求解平面上距离最近的点对的C++代码,使用了分治法,时间复杂度为O(nlogn)。
```
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 100005;
const double INF = 1e30;
struct Point {
double x, y;
} p[MAXN], tmp[MAXN];
bool cmp(Point a, Point b) {
return a.x < b.x;
}
bool cmp_y(Point a, Point b) {
return a.y < b.y;
}
double dist(Point a, Point b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double merge(int l, int r, double d) {
if (l == r) return INF;
int mid = (l + r) >> 1;
double midx = p[mid].x;
double ans = min(merge(l, mid, d), merge(mid + 1, r, d));
int cnt = 0;
for (int i = l; i <= r; i++) {
if (fabs(p[i].x - midx) <= d) {
tmp[cnt++] = p[i];
}
}
sort(tmp, tmp + cnt, cmp_y);
for (int i = 0; i < cnt; i++) {
for (int j = i + 1; j < cnt && tmp[j].y - tmp[i].y < d; j++) {
ans = min(ans, dist(tmp[i], tmp[j]));
}
}
return ans;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> p[i].x >> p[i].y;
}
sort(p, p + n, cmp);
printf("%.4f\n", merge(0, n - 1, INF));
return 0;
}
```
阅读全文