设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
代码长度限制
16 KB
时间限制
150 ms
内存限制
64 MB
#include<stdio.h>
#include<math.h>
typedef struct point {
double x;
double y;
}point;
double Distance(point a, point b)
{
double dis;
dis = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
return dis;
}
int main()
{
int n;
point a[100] = { 0 };
scanf_s("%d", &n);
int min1, min2;
double dis, min;
for (int i = 0; i < n; i++)
{
scanf_s("%lf%lf", &a[i].x, &a[i].y);
}
min1 = 0;
min2 = 1;
min = Distance(a[min1], a[min2]);
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
dis = Distance(a[i], a[j]);
if (dis < min)
{
min = dis;
min1 = i;
min2 = j;
}
}
}
if(a[min1].x+a[min1].y<=a[min2].x+a[min2].y)
printf("(%.2f,%.2f),(%.2f,%.2f),miniDist=%.3f", a[min1].x, a[min1].y, a[min2].x, a[min2].y, min);
else printf("(%.2f,%.2f),(%.2f,%.2f),miniDist=%.3f", a[min2].x, a[min2].y, a[min1].x, a[min1].y, min);
return 0;
}