给出一些整数对,它们表示平面上的点,求所有这些点中距离最近的两个点。
输入格式:
测试数据有多组。对于每组测试,先输入一个整数N,表示点的个数,再输入N个点(以两个整数表示横纵坐标)。若N为0,则表示输入结束。
输出格式:
对于每组测试,输入所有点中距离最短的两点,格式为“(a,b) (c,d)”,其中,a,b,c,d分别表示第一、二个点的横纵坐标。若有多个点对之间距离最短,以先输入者优先(如第一组样例所示)。
输入样例:
4
1 1
2 2
0 0
3 3
4
1 2
0 0
3 6
7 2
10
28 185
246 115
252 141
239 129
123 10
186 60
6 70
255 92
95 143
63 144
20
100 156
172 181
119 239
113 10
86 115
104 83
297 210
122 228
167 64
210 280
159 80
230 97
286 275
263 174
10 244
125 286
53 112
16 186
141 116
124 282
0
输出样例:
(1,1) (2,2)
(1,2) (0,0)
(246,115) (239,129)
(125,286) (124,282)
出处:
ZJUTOJ
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <stdio.h>
#include <math.h>
void print_min_point(int a[],int b[],int N)
{
float len(int a,int b,int c,int d);
float min;
min=len(a[0],b[0],a[1],b[1]);
for(int i=0;i<N;i++)
for(int j=i+1;j<N;j++)
if(len(a[i],b[i],a[j],b[j])<min)
min=len(a[i],b[i],a[j],b[j]);
for(int i=0;i<N;i++)
{
int j=i+1;
for(;j<N;j++)
{
if(len(a[i],b[i],a[j],b[j])==min)
{
printf("(%d,%d) (%d,%d)\n",a[i],b[i],a[j],b[j]);
break;
}
}
if(len(a[i],b[i],a[j],b[j])==min)
break;
}
}
float len(int a,int b,int c,int d)
{
float value;
value=sqrt((a-c)*(a-c)+(b-d)*(b-d));
return value;
}
int main()
{
int N;
while(1)
{
scanf("%d",&N);
if(N==0)
break;
int a[8600],b[8600];
for(int i=0;i<N;i++)
scanf("%d%d",&a[i],&b[i]);
print_min_point(a,b,N);
}
return 0;
}