#define?_CRT_SECURE_NO_WARNINGS
#include?<iostream>??
#include?<cmath>??
#include?<algorithm>??
#define?MAXN?100005??
using?namespace?std;
struct?Point
{
double?x,?y;
};
struct?Point?point[MAXN],?*px[MAXN],?*py[MAXN];
double?get_dis(Point?*p1,?Point?*p2)
{
return?sqrt((p1->x?-?p2->x)*(p1->x?-?p2->x)?+?(p1->y?-?p2->y)*(p1->y?-?p2->y));
}
bool?cmpx(Point?*p1,?Point?*p2)?{?return?p1->x<p2->x;?}
bool?cmpy(Point?*p1,?Point?*p2)?{?return?p1->y<p2->y;?}
double?min(double?a,?double?b)?{?return?a<b???a?:?b;?}
//-------核心代碼------------//??
double?closest(int?s,?int?e)
{
if?(s?+?1?==?e)
return?get_dis(px[s],?px[e]);
if?(s?+?2?==?e)
return?min(get_dis(px[s],?px[s?+?1]),?min(get_dis(px[s?+?1],?px[e]),?get_dis(px[s],?px[e])));
int?mid?=?(s?+?e)?>>?1;
double?ans?=?min(closest(s,?mid),?closest(mid?+?1,?e));//遞歸求解??
int?i,?j,?cnt?=?0;
for?(i?=?s;i?<=?e;i++)//把x坐標(biāo)在px[mid].x-ans~px[mid].x+ans范圍內(nèi)的點(diǎn)取出來(lái)??
{
if?(px[i]->x?>=?px[mid]->x?-?ans&&px[i]->x?<=?px[mid]->x?+?ans)
py[cnt++]?=?px[i];
}
sort(py,?py?+?cnt,?cmpy);//按y坐標(biāo)排序??
for?(i?=?0;i<cnt;i++)
{
for?(j?=?i?+?1;j<cnt;j++)//py數(shù)組中的點(diǎn)是按照y坐標(biāo)升序的??
{
if?(py[j]->y?-?py[i]->y?>=?ans)
break;
ans?=?min(ans,?get_dis(py[i],?py[j]));
}
}
return?ans;
}
int?main()
{
int?i,?n;
while?(scanf("%d",?&n)?!=?EOF)
{
if?(n?==?0)
break;
for?(i?=?0;i<n;i++)
{
scanf("%lf%lf",?&point[i].x,?&point[i].y);
px[i]?=?&point[i];
}
sort(px,?px?+?n,?cmpx);
//for(i=0;i<n;i++)??
//?printf("(%.2lf,%.2lf)--",px[i].x,px[i].y);??
double?distance?=?closest(0,?n?-?1);
printf("%.2lf\n",?distance?/?2);
}
return?0;
}
添加回答
舉報(bào)
0/150
提交
取消