最短距离的两点

给出一些整数对,它们表示平面上的点,求所有这些点中距离最近的两个点。

输入格式:

测试数据有多组。对于每组测试,先输入一个整数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;
}

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮央乜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值