最近点对问题求指导

Meutuo 2017-05-21 11:11:51
小白初学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
*/
最后是测试用的数据
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-05-23
  • 打赏
  • 举报
回复
初始值设为INT_MAX
幻夢之葉 2017-05-22
  • 打赏
  • 举报
回复
float getClose(int left, int right) { float d=0; if(left==right) { return d; //思考下这个返回是否合理 } //... }
Meutuo 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
float getClose(int left, int right) { float d=0; if(left==right) { return d; //思考下这个返回是否合理 } //... }
引用 2 楼 jianwen0529 的回复:
float getClose(int left, int right) { float d=0; if(left==right) { return d; //思考下这个返回是否合理 } //... }
经您提点,确实有问题,我的想法是分治过程到最后肯定会是一个点也就产生了这个最小值0,所以最后输出一直是0,我现在改成了一个极大值,目前可以正确输出,但我还有想法是若点的分部恰好是可以二分完的一个情况那会不会返回这个初始d值么呢本人新手小白如果有错误还希望您指教
paschen 版主 2017-05-21
  • 打赏
  • 举报
回复
在适当地方设置断点,然后看程序每一步各变更怎么变化的,以分析原因

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧