求助,分治算法求最近点对问题~~

Krystal_ 2013-04-22 08:53:41
要求用C语言
我的代码是这样的,但不知道是什么问题

#include<stdio.h>
#define N 100000
#include<math.h>
struct point
{
double x , y;
}p[N],r[N],q[N];
int a[N]; //保存筛选的坐标点的索引
void BubbleSort1(struct point q[],int n)
{
int i,j;
double b,c;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(r[j].x>r[j+1].x)
{
b=q[j].x;
q[j].x=q[j+1].x;
q[j+1].x=b;
c=q[j].y;
q[j].y=q[j+1].y;
q[j+1].y=c;
}
}
}
}
void BubbleSort2(struct point r[],int n) //这里用的是下标索引
{
int i,j;
double b,c;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(r[j].y>r[j+1].y)
{
b=r[j].x;
r[j].x=r[j+1].x;
r[j+1].x=b;
c=r[j].y;
r[j].y=r[j+1].y;
r[j+1].y=c;
}
}
}
}

double dis(struct point a , struct point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double min(double a , double b)
{
return a < b ? a : b;
}

double closest(int low , int high)
{int mid=(low + high)>>1;
double ans = min( closest(low , mid) , closest(mid + 1 , high) ); //分治法进行递归求解d1和d2中较小的一个
int i , j , cnt = 0;
if(low+1==high)
return dis(p[low] , p[high]);
if(low+2==high)
return min(dis(p[low] , p[high]), min( dis(p[low] , p[low+1]) , dis(p[low+1] , p[high])));
for(i = low ; i <= high ; ++i) //把x坐标在p[mid].x-ans~p[mid].x+ans范围内的点取出来
{
if(p[i].x >= p[mid].x - ans && p[i].x <= p[mid].x + ans)
a[cnt++] = i; //保存的是下标索引
}
BubbleSort2(a,cnt); //按y坐标进行升序排序
for(i = 0 ; i < cnt ; ++i)
{
for(j = i+1 ; j < cnt ; ++j)
{
if(p[a[j]].y - p[a[i]].y >= ans) //注意下标索引
break;
ans = min(ans , dis(p[a[i]] , p[a[j]]));
}
}
return ans;
}
int main(void)
{
int i,n;
printf("输入坐标点个数:\n");
scanf("%d",&n);
for(i=0 ; i < n ; ++i)

{scanf("%lf %lf",&p[i].x,&p[i].y);}
BubbleSort1(p,n);
printf("最近的距离为:%.2lf\n",closest(0 , n - 1)/2);

return 0;
}

运行时,输入完坐标后出错~
...全文
348 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Krystal_ 2013-04-23
  • 打赏
  • 举报
回复
肿么没人啊~where is dashen
念言 2013-04-23
  • 打赏
  • 举报
回复
大神在此,,

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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