题目:
在二维平面上的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-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dist;
int t[maxn];
double Closest(int l,int r,int &a,int &b)

本文介绍了如何使用分治策略解决二维平面上n个点中找到最近点对的问题。首先按x坐标排序,将点分为两组,分别计算组内和组间最接近点对,取最小值作为整体解。通过递归处理,最终解决最小子问题,如仅两个或三个点的情况。给出的代码实现了这一算法,并给出了具体输入输出示例。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



