最近的点对要不是x方向相邻,就是y方向相邻。分别按x,y方向排序,依次求距离,取最小的。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
struct Point
{
double x,y;
};
bool basedX(Point& a,Point& b)
{
return a.x < b.x;
}
bool basedY(Point& a,Point& b)
{
return a.y < b.y;
}
int main()
{
const int Size = 100000;
vector<Point> p(Size);
int n,i;
double ans;
scanf("%d",&n);
while (n)
{
for(i = 0;i < n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p.begin(),p.begin()+n,basedX);
ans = pow(p[0].x-p[1].x,2)+pow(p[0].y-p[1].y,2);
for(i = 1;i < n - 1;i++)
if (pow(p[i].x-p[i+1].x,2)+pow(p[i].y-p[i+1].y,2) < ans)
ans = pow(p[i].x-p[i+1].x,2)+pow(p[i].y-p[i+1].y,2);
sort(p.begin(),p.begin()+n,basedY);
for(i = 0;i < n - 1;i++)
if (pow(p[i].x-p[i+1].x,2)+pow(p[i].y-p[i+1].y,2) < ans)
ans = pow(p[i].x-p[i+1].x,2)+pow(p[i].y-p[i+1].y,2);
ans = sqrt(ans) / 2;
printf("%0.2lf/n",ans);
scanf("%d",&n);
}
return 0;
}