向左走

题意:

将点的坐标按y轴从小到大输出,如果y相同就按x从小到大输出

思路:

1.输入的时候先找到起点
2.然后依次找后面俩个点,如果后面俩个点的顺序不符合,则交换
3.判断点的顺序可以用差积来实现

代码:

#include <iostream>
#include <cmath>

using namespace std;

const int N=1010;

struct Point 
{
    int id,x,y;

}p[N];

int cross(Point a,Point b,Point c)
{
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}

int dist(Point a,Point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

bool check(Point a,Point b,Point c)
{
    if(cross(a,b,c)>0 || (cross(a,b,c)==0 && dist(a,c)<dist(b,c)))
        return true;
    return false;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=-1)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&p[i].id,&p[i].x,&p[i].y);
            if(p[i].y<p[0].y || (p[i].y==p[0].y && p[i].x<p[0].x)) swap(p[i],p[0]);
        }

        for(int i=0;i<n;i++)
        {
            for(int j=i+2;j<n;j++)
            {
                if(check(p[j],p[i+1],p[i])) swap(p[j],p[i+1]);
            }
        }

        for(int i=0;i<n-1;i++) printf("%d ",p[i].id);
        printf("%d\n",p[n-1].id);
    }
}
全部评论

相关推荐

程序员小白条:这比例牛逼,750:1
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务