2661 - 结构体练习-3

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

寻找最近点

在一个平面上的第一象限中的若干个点中,寻找距离坐标原点最近的点。假设每个点用两个坐标表示。

定义一个结构体,描述点的信息,可参考如下:

struct point{

    int x;  //横坐标

    int y;  //纵坐标

};

从键盘输入一个整数n (1 <= n < = 100),表示有n个候选的点,然后输入n个点的横纵坐标。现要从中选出距离原点最近的点并输出,假设距离的值保留两位小数,如果两个点到原点的距离相等,则取横坐标小的点;如果两个点到原点的距离相等且横坐标相等,则取纵坐标小的点。输出的格式为“(横坐标,纵坐标)”。

题目输入

5

1 4

5 0
8 3
9 3
6 4

题目输出

(1,4)

输入/输出样例

输入格式

20
8 6
9 0
8 7
7 4
1 2
3 3
3 8
0 1
1 3
9 2
8 7
7 4
5 1
7 1
1 6
8 1
5 1
2 7
9 6
6 8

输出格式

(0,1)

C语言解答

#include<stdio.h>
#include<math.h>

struct point{

    int x;  //横坐标

    int y;  //纵坐标

    double dis; //离原点距离

}a[100];

void shuru(int n);

struct point getPoint(struct point *p, int n);

int main()
{
    struct point *p, ab;

    int n, i;
    p = a;
    scanf("%d", &n);
    shuru(n);
    ab = getPoint(p, n);
    printf("(%d,%d)", ab.x, ab.y);


}

void shuru(int n)
{
    int x, y;
    int i = 0;

    while((scanf("%d%d", &a[i].x, &a[i].y) == 2) && (++i < n) );

}

struct point getPoint(struct point *p, int n)
{
    int i, j, t;
    double h;
    struct point xy;
    for(i=0; i<n; i++)
    {
        (p+i)->dis = sqrt((((p+i)->x) * ((p+i)->x)) + (((p+i)->y) * ((p+i)->y)));
    }

    for(i=0; i<n-1; i++)
    {
        for(j=0; j<n-i-1; j++)
        {
            if((p+j)->dis > (p+j+1)->dis)
            {
                h = (p+j)->dis;
                (p+j)->dis = (p+j+1)->dis;
                (p+j+1)->dis = h;

                t = (p+j)->x;
                (p+j)->x = (p+j+1)->x;
                (p+j+1)->x = t;

                t = (p+j)->y;
                (p+j)->y = (p+j+1)->y;
                (p+j+1)->y = t;

            }
        }
    }
    if(p->dis < (p+1)->dis)
    {
        xy.x = p->x;
        xy.y = p->y;
        xy.dis = p->dis;
    }
    else if(p->dis == (p+1)->dis)
    {
        if(p->x < (p+1)->x)
        {
            xy.x = p->x;
            xy.y = p->y;
            xy.dis = p->dis;
        }
        else if(p->x > (p+1)->x)
        {
            xy.x = (p+1)->x;
            xy.y = (p+1)->y;
            xy.dis = (p+1)->dis;
        }
        else if(p->x == (p+1)->x)
        {
            if(p->y < (p+1)->y)
            {
                xy.x = p->x;
                xy.y = p->y;
                xy.dis = p->dis;
            }
            else
            {
                xy.x = (p+1)->x;
                xy.y = (p+1)->y;
                xy.dis = (p+1)->dis;
            }
        }
    }
    return xy;

}

C++解答

#include<stdio.h>
#include<math.h>

struct point{

    int x;  //横坐标

    int y;  //纵坐标

    double dis; //离原点距离

}a[100];

void shuru(int n);

struct point getPoint(struct point *p, int n);

int main()
{
    struct point *p, ab;

    int n, i;
    p = a;
    scanf("%d", &n);
    shuru(n);
    ab = getPoint(p, n);
    printf("(%d,%d)", ab.x, ab.y);


}

void shuru(int n)
{
    int x, y;
    int i = 0;

    while((scanf("%d%d", &a[i].x, &a[i].y) == 2) && (++i < n) );

}

struct point getPoint(struct point *p, int n)
{
    int i, j, t;
    double h;
    struct point xy;
    for(i=0; i<n; i++)
    {
        (p+i)->dis = sqrt((((p+i)->x) * ((p+i)->x)) + (((p+i)->y) * ((p+i)->y)));
    }

    for(i=0; i<n-1; i++)
    {
        for(j=0; j<n-i-1; j++)
        {
            if((p+j)->dis > (p+j+1)->dis)
            {
                h = (p+j)->dis;
                (p+j)->dis = (p+j+1)->dis;
                (p+j+1)->dis = h;

                t = (p+j)->x;
                (p+j)->x = (p+j+1)->x;
                (p+j+1)->x = t;

                t = (p+j)->y;
                (p+j)->y = (p+j+1)->y;
                (p+j+1)->y = t;

            }
        }
    }
    if(p->dis < (p+1)->dis)
    {
        xy.x = p->x;
        xy.y = p->y;
        xy.dis = p->dis;
    }
    else if(p->dis == (p+1)->dis)
    {
        if(p->x < (p+1)->x)
        {
            xy.x = p->x;
            xy.y = p->y;
            xy.dis = p->dis;
        }
        else if(p->x > (p+1)->x)
        {
            xy.x = (p+1)->x;
            xy.y = (p+1)->y;
            xy.dis = (p+1)->dis;
        }
        else if(p->x == (p+1)->x)
        {
            if(p->y < (p+1)->y)
            {
                xy.x = p->x;
                xy.y = p->y;
                xy.dis = p->dis;
            }
            else
            {
                xy.x = (p+1)->x;
                xy.y = (p+1)->y;
                xy.dis = (p+1)->dis;
            }
        }
    }
    return xy;

}