LightOj1285 - Drawing Simple Polygon(连接多边形各点)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1285

题意:给你一些点,然后把它们用一条线把它们连起来,构成一个多边形,不能有相交,必须用完所有的点,如果不能构成输出Impossible;

不能构成就是所有的点在一条直线上的时候;先按极角进行排序,然后倒着找到一个不再起点到终点那条线上的点,倒着连接起来;

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 2010;
const double eps = 1e-6;
const double PI = acos(-1);
struct point
{
    double x, y;
    int Id;
    point(){}
    point(double x, double y) : x(x), y(y) {}
    point friend operator - (const point &p1, const point &p2)///矢量p2p1;
    {
        return point(p1.x-p2.x, p1.y-p2.y);
    }
    double friend operator ^ (const point &p1, const point &p2)///p1×p2;
    {
        return p1.x*p2.y - p1.y*p2.x;
    }
};

point p[N];

double Dist(point p1, point p2)
{
    double dx = p1.x - p2.x, dy = p1.y - p2.y;
    return sqrt(dx*dx + dy*dy);
}
int cmp1(point p1, point p2)///位置排序,找到最下方的;
{
    if(p1.y != p2.y)
        return p1.y < p2.y;
    return p1.x < p2.x;///若有多个下方的找左边的;
}
int cmp2(point p1, point p2)///极角排序;若极角相同,距离近的在前面;
{
    double k = (p1-p[0])^(p2-p[0]);
    if( k>eps || (fabs(k)<eps && Dist(p1, p[0]) < Dist(p2, p[0]) ))
        return 1;
    return 0;
}

int main()
{
    int n, T, t=1;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%lf %lf", &p[i].x, &p[i].y);
            p[i].Id = i;
        }

        sort(p, p+n, cmp1);///p[0]为最下方靠左的点;
        sort(p+1, p+n, cmp2);///以p[0]为基点,按叉积进行排序;

        int flag = 0;
        for(int i=n-2; i>0; i--)
        {
            if(((p[n-1]-p[0])^(p[i]-p[0]))!=0)
            {
                flag = i;
                break;
            }
        }
        printf("Case %d:\n", t++);
        if(flag==0)
        {
            printf("Impossible\n");
            continue;
        }
        reverse(p+flag+1, p+n);
        for(int i=0; i<n; i++)
            printf("%d%c", p[i].Id, i==n-1?‘\n‘:‘ ‘);
    }
    return 0;
}

时间: 2024-10-12 12:40:01

LightOj1285 - Drawing Simple Polygon(连接多边形各点)的相关文章

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形

<zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure AddNoiseWhiteContourXld( const Contours: IHUntypedObject

[svg 翻译教程]Polyline(折线)polygon(多边形)

原文: http://tutorials.jenkov.com/svg/polygon-element.html Polyline 虽然说这个 元素我没用过,但是还是蛮强大的,也翻译下 示例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <polyline points="0,0 30,0 15,30" st

e586. Drawing Simple Shapes

There are two ways to draw basic shapes like circles, ovals, lines, arcs, squares, rectangles, rounded rectangles, and polygons. The first is to use specific drawing methods like Graphics.drawOval(). This example uses these methods. The second is to

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

poj1265&amp;&amp;2954 [皮克定理 格点多边形]【学习笔记】

Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 Given a simple polygon constructed on a grid of equal-distanced points (i.e., points with integer coordinates) such that all the polygon's vertices a

判断点是否在多边形内

有一个n边形,顶点为p1,p2,...,pn;给定一个已知点p,判断p在此多边形内还是外. 预备知识: 两线段相交的定义,如果一条线段的两端分别处在另一条线段的两端,则此两线段相交 判断2点在线段的两侧可以用向量的叉乘实现! 基本步骤: 1,过p点垂直向上作一条射线 2,判断此射线与n边形n条边的交点 3,把所有交点相加,如果是奇数则说明在多边形内,否则在多边形外 思路非常的简单,另外说明一下几种特殊的情况: 1,射线与多边形的顶点相交:比如射线过多边形的Pi点,则如果Pi-1和Pi+1在此射线

OpenGL研究3.0 多边形区域填充

DionysosLai([email protected])2014-06-22 所谓多边形区域填充.就是将多边形内部区域,所有已相同色块填充.注意:这里讨论的多边形是简单多边形(即不考虑诸如五角星这样的相交多边形).简单多边形,分为凹多边形和凸多边形. 多边形区域填充有下面几种方法: 1.      逐点扫描方法: 原理:扫描多边形区域,逐点推断点是否在多边形内. 难点:在于怎样推断点是否在区域内; 经常使用怎样推断点是否在区域内方法:射线法.面积法. 面积法原理:取一个点.连接多边形各个点,

poj3335 半交平面,多边形内核

Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5300   Accepted: 2112 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the ed

POJ 3335 半平面交求多边形的核

Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4899   Accepted: 1946 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the ed