Segments POJ - 3304

Segments

题目链接:https://vjudge.net/problem/POJ-3304

题目:

Segments POJ - 3304_第1张图片

 

Segments POJ - 3304_第2张图片

 

题意:问是否存在一条直线,使所有线段到这条直线的投影至少有一个交点。

思路:就是看有没有一条直线与所有的线段相交,由于数据很小,因此可以暴力求解,将题目给的所有点用结构体存起来,然后任意两个端点相连为一条直线,判断该直线是否与所有的线段相交即可,在设定为直线前先判断该两点之间距离是否小于1e-8,若小于则可以看作为一点,不可组成直线,继续与其他点成为直线,暴力判断。

 

// 
// Created by HJYL on 2020/1/12.
//
#include
#include
#include

#define eps 1e-8
#define pi  3.141592653589793
const int maxn=1e5+10;

using namespace std;

struct Point{
    double x,y;
    Point(double a=0,double b=0){x=a;y=b;}
};

typedef Point Vector;

struct Line{
    double a,b,c,angle;
    Point p1,p2;
    Line(Point s,Point e)
    {
        a=s.y-e.y;
        b=e.x-s.x;
        c=s.x*e.y-e.x*s.y;
        angle=atan2(e.y-s.y,e.x-s.x);
        p1=s;p2=e;
    }
    Line(){}
};

struct Segment
{
    Point s,e;
    Segment(Point a,Point b){s=a;e=b;}
    Segment(double x1,double y1,double x2,double y2)
    {
        s=Point(x1,y1);
        e=Point(x2,y2);
    }
    Segment(){}
};

Vector operator + (Point a,Point b)
{
    return Vector(a.x+b.x,a.y+b.y);
}

Vector operator - (Point a,Point b)
{
    return Vector(a.x-b.x,a.y-b.y);
}

Vector operator * (Point a,double k)
{
    return Vector(a.x*k,a.y*k);
}

Vector operator / (Point a,double k)
{
    return Vector(a.x/k,a.y/k);
}

double Cross(Point &sp, Point &ep, Point &op)
{
    return (sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y);
}

double Cross(Vector a,Vector b)
{
    return a.x*b.y-b.x*a.y;
}

int epssgn(double x)
{
    if(fabs(x)eps) return 0;
    else return 1;
}

int main()
{
    //freopen("text","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        Point ll[maxn];
        double xx,yy,xx1,yy1;
        int pos=0;
        for(int i=0;i 
 

  

你可能感兴趣的:(Segments POJ - 3304)