最近对问题(分治法)
问题
在给定的n个二维点中求得一对点的最小距离
解析
首先对点对根据x轴从小到大排序 并将其分为大小为n/2的两个集合S1,S2,并且对S1,S2进行递归,则总集合点对最小距离可能有三种情况:
1.两个点均在S1,min为S1的最短距离
2.两个点均在S2,min为S2的最短距离
3.一个点在S1,一个点在S2,那么这两个点x左边可能范围是中位点加减min(dS1,dS2)
递归操作:递归至子集中只剩一个点或者两个点结束。返回集合中点对最小距离,一个点返回最大常数,两个点返回点之间距离,3个及以上返回左右集合中较小的距离end=min(左,右),归并到最大的集合后,将离中位点x轴距离小于end的加入子集X,计算x中最小距离并且和end比较得出结果
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define max 1e6;
struct node {
double x;
double y;
}point[1000];
double distance(int l, int r)
{
return sqrt((point[l].x - point[r].x) * (point[l].x - point[r].x) + ((point[l].y - point[r]