码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1007 Quoit Design 分治法求最近点对

时间:2015-06-03 15:54:03      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

题意:给n个点的坐标,求距离最近的一对点之间距离的一半。

分析:分治法求最近点对。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

#define N 100005

double min(double a,double b)
{
	return a<b?a:b;
}

struct POINT
{
	double x,y;
};
POINT point[N],*px[N],*py[N];

double dis(const POINT* p1,const POINT* p2)
{
	return sqrt(pow(p1->x-p2->x,2.0)+pow(p1->y-p2->y,2.0));
}

bool cmpx(const POINT* p1,const POINT* p2)
{
	return p1->x<p2->x;
}

bool cmpy(const POINT* p1,const POINT* p2)
{
	return p1->y<p2->y;
}

double core(int s,int e)  //分治法求最小点对核心代码
{
	int mid,i,j,cnt;
	double ans;

	if(s+1==e)        //只有两个点的情况
		return dis(px[s],px[e]);
	if(s+2==e)        //只有三个点的情况
		return min(dis(px[s],px[s+1]),min(dis(px[s+1],px[e]),dis(px[s],px[e])));
	mid=(s+e)>>1;
	ans=min(core(s,mid),core(mid+1,e));  //递归求解
	for(cnt=0,i=s;i<=e;i++)    //把x坐标在px[mid].x-ans~px[mid].x+ans范围内的点取出来
		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值排序
	for(i=0;i<cnt;i++)
		for(j=i+1;j<cnt;j++)
		{
			if(py[j]->y-py[i]->y>=ans)
				break;
			ans=min(ans,dis(py[i],py[j]));
		}
	return ans;
}

int main()      
{
	int i,n;

	while(scanf("%d",&n)!=EOF && n)
	{
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf",&point[i].x,&point[i].y);
			px[i]=&point[i];
		}
		sort(px,px+n,cmpx);       //按x坐标排序
		printf("%.2lf\n",core(0,n-1)/2.0);
	}
    return 0;      
}


HDU ACM 1007 Quoit Design 分治法求最近点对

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46344395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!