算法课的题目,平面有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; }