最近点对问题求指导
小白初学C++和算法 遇到最近点对问题,但输出的最近距离一直是初始化的0,并没有按本意输出,求指导,以下是代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int Max=10000;
struct Point
{
float x,y;
};
Point p[Max];
int a[Max];
float Dis(int i,int j)
{
return sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
int compP(const Point &a,const Point &b)
{
if(a.x<b.x)
return 1;
else if(a.x==b.x)
{
if(a.y<b.y)
return 1;
else
return 0;
}
else return 0;
}
int compy(const int &a,const int &b)
{
if(p[a].y<p[b].y)
return 1;
else return 0;
}
float getClose(int left,int right)
{
float d=0;
if(left==right)
{
return d;
}
else if(left+1==right)
{
d=Dis(left,right);
}
else
{
int mid=(left+right)/2;
float d1=getClose(left,mid);
float d2=getClose(mid+1,right);
float d3;
d=d1<d2?d1:d2;
int i,k=0;
for(i=left;i<=right;i++)
{
if(abs(p[mid].x-p[i].x)<=d)
{
a[k++]=i;
}
}
sort(a,a+k,compy);
for(i=0;i<k;i++)
{
for(int j=i+1;j<k&&p[a[j]].y-p[a[i]].y<d;j++)
{
d3=Dis(a[i],a[j]);
if(d3<d) d=d3;
}
}
}
return d;
}
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
{
cin>>p[i].x;
cin>>p[i].y;
}
sort(p,p+n,compP);
printf("%f\n",getClose(0,(n-1)));
return 0;
}
/*
6
2 3
12 30
40 50
5 1
12 10
3 4
*/
最后是测试用的数据