作者 李军 单位 陕西理工大学
设P={(x1,y1),(x2,y2),⋯,(xn,yn)}是平面上散列的n个点的集合。请编写程序找出集合中距离最近的点对。严格地说,相同距离的最近点对可能不止一对,为了简单期间只找出第一对最近点对即可。
输入格式:
输入第一行给出一个正整数n,表示平面上的点数。随后n行,每行给出一个实数对,每个实数对表示一个点的纵横坐标值,其中第1数表示横坐标,第2数表示纵坐标。
输出格式:
输出最近点对中两个点的坐标和它们之间的距离。如果 x1+y1<=x2+y2则按
(x1,y1),(x2,y2),miniDist=Distance
输出结果,否则按
(x2,y2),(x1,y1),miniDist=Distance
输出结果。
其中x1,y1,x2,y2是保留两位小数的实数,Distance是保留3位小数的实数
输入样例:
5
1.00 1.00
2.00 0.00
0.00 2.00
0.50 0.60
-1.00 2.00
输出样例:
(0.50,0.60),(1.00,1.00),miniDist=0.640
#include<stdio.h>
#include<math.h>
struct spot{double x,y;};
int main() {
int n,a=0,b=1;
scanf("%d",&n);
struct spot m[n];
for(int i=0;i<n;i++) {
scanf("%lf %lf",&m[i].x,&m[i].y);
}
double m1=sqrt(pow(m[0].x-m[1].x, 2)+pow(m[0].y-m[1].y,2));
for(int i=0;i<n-1;i++) {
for(int j=i+1;j<n;j++) {
double m2=sqrt(pow(m[i].x-m[j].x,2)+pow(m[i].y-m[j].y,2));
if(m2<m1) {m1=m2;a=i;b=j;
}
}
}
if(m[a].x+m[a].y>m[b].x+m[b].y) {struct spot t=m[a];m[a]=m[b];m[b]=t;}
printf("(%.2f,%.2f),(%.2f,%.2f),miniDist=%.3f",m[a].x,m[a].y,m[b].x,m[b].y,m1);
}
1270

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



