题目:
在二维平面上的n个点中,快速的找出最近的一对点。
思路:
分治,把平面上所有点按照x从小到大排序,分成两个集合,分别求出两个集合内的最接近点对,然后是这两个集合之间的最接近点对,二者取最小值则是整个问题的最终解。通过不断地递归分治,最终的状态只可能是只有两个点或者是只有三个点求最接近点对,也就是该问题的最小子问题。关键是在两个集合中与集合之间最接近点对的比较,详见代码。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;
struct node
{
int x,y;
};
node p[maxn],c1,c2;
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-