帮我看看这道题,求帮忙!!!!

wdaydream 2013-03-24 10:37:02
#include<stdio.h>
#include<math.h>
#define N 100
struct point
{
int x,y;
};
void InsSortx(point a[],int n)
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];int j=i-1;
while(a[0].x<a[j].x)
{
a[j+1]=a[j];j=j-1;
}
a[j+1]=a[0];
}

}
void InsSorty(point a[],int n)
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];int j=i-1;
while(a[0].y<a[j].y)
{
a[j+1]=a[j];j=j-1;
}
a[j+1]=a[0];
}

}

int Sqrt(point a,point b)
{
int k;
k=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return k;
}

double min(double d1,double d2){
if(d1<=d2)
return d1;
else
return d2;
}

int ClosestPoints1(point p[],int n,point & one,point & two)
{
int d=9999;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int temp=Sqrt(p[i],p[j]);
if(temp<d)
{
one=p[i];
two=p[j];
d=temp;
}
}
return d;
}

int ClosestPoints2(point S[],int n)
{
if(n<2) return 10000;
if(n==2)
{
int d=Sqrt(S[1],S[2]);
return d;
}
InsSortx(S,n);
int m=S[n/2].x;
int t=n/2;int i;
point S1[5000],S2[5000];
for(i=1;i<=t;i++)
{
S1[i]=S[i];
}
for(i=t+1;i<=n;i++)
{
S2[i-t]=S[i];
}
int d1=ClosestPoints2(S1,t);
int d2=ClosestPoints2(S2,n-t);
int d=min(d1,d2);
point p1[N],p2[N];
int j;
int p1l=1,p2l=1;
for(i=1;i<=t;i++)
{
if(abs(S1[i].x-m)<d)
{
p1[p1l+1]=S1[i];
p1l++;
}
}
for(i=1;i<=n-t;i++)
{
if(abs(S2[i].x-m)<d)
{
p2[p2l+1]=S2[i];
p2l++;
}
}
InsSorty( p1,p1l+1);
InsSorty( p2,p2l+1);
int md=10000;
for(i=1;i<=p1l;i++)
{
for(j=1;fabs(p2[j].y-p1[i].y)<d;j++)
{
int pd=Sqrt(p1[i],p2[j]);
md=min(pd,md);
}
}
return min(d,md);
}
void main()
{
point p[N],a,b;
int n=20;int d;
printf("请输入点对数目:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
printf("请输入第%d个点的横坐标:",i);
fflush(stdin);
scanf("%d",&(p[i].x));
printf("请输入第%d个点的纵坐标:",i);
fflush(stdin);
scanf("%d",&(p[i].y));

}
printf("输入的点对坐标分别是:\n");
for(int j=1;j<=n;j++)
{
printf("<%d,%d>,",p[j].x,p[j].y);
fflush(stdin);
}
d=ClosestPoints1(p,n,a,b);
printf("\n蛮力法求最近点对:\n");
printf("两点间距离是:%f\n",sqrt(d));
printf("两点坐标为:<%d,%d>",a.x,a.y);
printf(",<%d,%d>",b.x,b.y);
d=ClosestPoints2(p,n);
printf("\n分治法求最近点对:\n");
printf("两点间距离是:%f\n",sqrt(d));
printf("两点坐标为:<%d,%d>",a.x,a.y);
printf(",<%d,%d>",b.x,b.y);
}
}
为什么分治法和蛮力法求得答案不一样
...全文
86 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
_sunshine 2013-03-25
  • 打赏
  • 举报
回复
引用 1 楼 dy106 的回复:
题目要求是以文本结束符为标志结束输入
上面答错了,楼主可以考虑单步调试吧
_sunshine 2013-03-25
  • 打赏
  • 举报
回复
题目要求是以文本结束符为标志结束输入

69,371

社区成员

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

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