算法课的题目,平面有n个点,计算所有点中距离最近的两个点的距离
可以把函数当成模板;具体分析过程相信书上也写的很明白了;
#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
int mpt[maxn];
struct Point
{
double x,y;
} p[maxn];
bool cmpx(Point a,Point b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
bool cmpy(const int& a, const int& b){
return p[a].y < p[b].y;
}
double dis(int i, int j)
{
return sqrt((p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y));
}
double closest(int left,int right)
{
double d=1e20;
if(left==right)
return d;
if(left+1==right)
{
return dis(left,right);
}
int mid=(left+right)/2;
double d1=closest(left,mid);
double d2=closest(mid+1,right);
d=min(d1,d2);
int k=0;
for(int i=left; i<=right; i++)
{
if(fabs(p[mid].x-p[i].x)<=d)
mpt[k++]=i;
}
sort(mpt,mpt+k);
for(int i=0; i<k; i++)
{
for(int j=i+1; j<k&&p[mpt[j]].y-p[mpt[i]].y<d; j++)
{
double d3=dis(mpt[i],mpt[j]);
d=min(d,d3);
}
}
return d;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
sort(p,p+n,cmpx);
printf("%.6lf\n", closest(0, n - 1) );
}
return 0;
}
本文介绍了一种计算平面上n个点中距离最近两点的方法。通过分治策略,先按x坐标排序,再递归计算左右半部分最近距离,并检查中间地带是否存在更近距离。该算法时间复杂度为O(n log n)。
2260

被折叠的 条评论
为什么被折叠?



