分治算法应用–求平面两点之间的最小距离


Implement the algorithm for the closest pair problem in your favourite lan-
guage.
INPUT: Given n points in a plane.
OUTPUT: the pair with the least Euclidean distance.

分析:

题目给n个点,求距离最近的一对点之间距离。该题主要思想就是分治,先把n个点按x坐标升序排序,然后求左边n/2个和右边n/2个的最近距离,最后进行合并。

根据课堂所讲算法,首先按x坐标升序排序,然后取中位数将序列分割成左右两个子序列,然后递归地分别求两个子序列的点间最短距离。取两个子序列的最短距离之中的小值暂时作为当前整个最小值,然后将序列按照y坐标升序排列,然后扫描两子序列分界处相邻11个点并计算之间距离,取这些距离的最小值再与子序列求得的最小值相比,取最终的最小值,就是最终结果。

代码实现:(C/C++)

#include

#include

#include

using namespace std;

 

#define N 10000

 

struct point

{

double x , y;

};

 

point p[N];

 

double dis(point p1,point p2)

{

return sqrt( (p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y) );

}

 

double min(double a , double b)

{

return ah? h:(i+11); //只要选取出11个相邻点

for(int j=i+1;j=c)

break;

c=min(c,dis(p[i],p[j]));

}

}

return c;

}

 

void main()

{

int n;

cin>>n;

for(int t=0;t>p[t].x;

cin>>p[t].y;

}

sort(&p[0],&p[n-1],cmpx);

cout<<“各点间最短距离为:”<


你可能感兴趣的:(算法)