LightOJ1285->极角排序

来源:互联网 发布:app数据查询 编辑:程序博客网 时间:2024/05/18 01:46

LightOJ1285->极角排序

题意:

给出平面上的N个点,每个点按照给出顺序编号,问能否只用一条线连接所有的点构成一个多边形,如果可以,则以最左下角的点为起点,逆时针输出多边形边上这些点的编号,否则输出impossible。

题解:

其实只要点的个数大于等于3并且这些点不都在同一条直线上,就能被连出一个多边形。
因此需要进行极角排序。由于极角排序时是角度相同时横纵坐标从小到大,所以需要从最后一个点开始判断一次这个点之上是否有相邻且和最后一个点与list[0]点构成向量平行的点。


代码:

#include <stdio.h>#include <string.h>#include <algorithm>#include <cmath>#include <iostream>using namespace std;struct Point{    int x,y;    int index ;    Point(int _x = 0, int _y = 0)    {        x = _x;        y = _y;    }    Point operator -(const Point &b)const    {        return Point(x - b.x, y - b.y);    }    int operator ^(const Point &b)const    {        return x*b.y - y*b.x;    }    int operator *(const Point &b)const    {        return x*b.x + y*b.y;    }    bool operator < (Point b)const    {        return x == b.x ? y < b.y:x < b.x;    }};int dist(Point a ,Point b){    return ((b - a) * (b - a)) ;}const int MAXN = 2010;Point list[MAXN];bool _cmp(Point p1,Point p2){    int tmp = (p1-list[0])^(p2-list[0]);    if(tmp > 0)return true;    else if(tmp == 0 && dist(p1,list[0]) <= dist(p2,list[0]))        return true;    else return false;}void anglesort(int n) //输入,并把最左下方的点放在list[0],并且进行极角排序{    int i,k;    for(int i = 0 ; i <n ; i ++)    {        scanf("%d%d" , &list[i].x,&list[i].y) ;        list[i].index = i ;    }    sort(list , list + n) ;    sort(list+1 , list+n , _cmp) ;    int tmp = 0;    for(int i = n-2 ; i >0 ; i --)    {        if(((list[n-1]-list[0])^(list[i]-list[0]))!=0)        {            tmp = i ;            break ;        }    }    if(tmp == 0)        printf("Impossible\n") ;    else    {        reverse(list+tmp+1,list+n) ;        for(int i = 0 ; i < n ; i ++)        {            if(i == n-1) printf("%d\n",list[i].index) ;            else printf("%d " ,list[i].index) ;        }    }}int main(){    int n , T;    scanf("%d" , &T) ;    for(int cas = 1 ; cas <= T ; cas ++)    {        scanf("%d" , &n) ;        printf("Case %d:\n",cas) ;        anglesort(n) ;    }    return 0;}
0 0