Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179157
  • 博文数量: 48
  • 博客积分: 4060
  • 博客等级: 上校
  • 技术积分: 1080
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 23:24
文章分类

全部博文(48)

文章存档

2011年(1)

2010年(8)

2009年(2)

2008年(37)

我的朋友

分类: C/C++

2008-03-05 19:51:39

#include
#include
#include
typedef struct
{
    double x,y ;
}
pttype ;
const long maxsize=100000 ;
long arr[maxsize],arrl ;
pttype pt[maxsize];
int sortcmp(const void*a,const void*b)
{
    if(((pttype*)a)->x<((pttype*)b)->x)return-1 ;
    else return 1 ;
}
double dist(pttype a,pttype b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double getmin(double a,double b)
{
    if(a>b)return b ;
    else return a ;
}
int arrcmp(const void*a,const void*b)
{
    if(pt[*(int*)a].y    else return 1 ;
}
double shortest(long l,long r)
{
    if(r-l==1)
        return dist(pt[l],pt[r]);
    if(r-l==2)
        return getmin(getmin(dist(pt[l],pt[l+1]),dist(pt[l],pt[r])),dist(pt[l+1],pt[r]));
    long i,j,mid=(l+r)>>1 ;
    double curmin=getmin(shortest(l,mid),shortest(mid+1,r));
    arrl=0 ;
    for(i=mid;i>=l&&pt[mid+1].x-pt[i].x<=curmin;i--) arr[arrl++]=i ;
   
    for(i=mid+1;i<=r&&pt[i].x-pt[mid].x<=curmin;i++) arr[arrl++]=i ;
   
    qsort(arr,arrl,sizeof(arr[0]),arrcmp);
    for(i=0;i    for(j=i+1;j        curmin=getmin(curmin,dist(pt[arr[i]],pt[arr[j]]));
    return curmin ;
}
main()
{
    long n,i ;
    while(1)
    {
        scanf("%d",&n);
        if(!n)break ;
        for(i=0;i            scanf("%lf%lf",&pt[i].x,&pt[i].y);
        qsort(pt,n,sizeof(pt[0]),sortcmp);
        printf("%.2lf\n",shortest(0,n-1)/2);
    }
}
阅读(599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~