poj3304 Segments(计算几何+直线相交)

原创 2016年08月30日 16:09:36

poj3304

题目

给你许多的线段,问存不存在一条直线使得所有线段在直线上的映射有至少一个交点。

思路

http://blog.sina.com.cn/s/blog_6635898a0100n2lv.html
要想到枚举两两端点,注意题目说的重点的存在。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

const int maxn=110;
const double eps = 1e-8;

int n;
int sgn(double x)
{
    if(fabs(x) < eps)return 0;
    if(x < 0) return -1;
    return 1;
}

struct Point
{
    double x,y;
    Point() {}
    Point(double _x,double _y)
    {
        x=_x;
        y=_y;
    }
    Point operator -(const Point &b)const
    {
        return Point(x - b.x,y - b.y);
    }
    double operator *(const Point &b)const
    {
        return x*b.x + y*b.y;
    }
    double operator ^(const Point &b)const
    {
        return x*b.y - y*b.x;
    }
};

struct Line
{
    Point s,e;
    Line() {}
    Line(Point _s,Point _e)
    {
        s = _s;
        e = _e;
    }
};

double xmult(Point p0,Point p1,Point p2)
{
    return (p1-p0)^(p2-p0);
}

bool Seg_inter_line(Line l1,Line l2)
{
    return sgn(xmult(l2.s,l1.s,l1.e))*sgn(xmult(l2.e,l1.s,l1.e)) <= 0;
}

double dist(Point a,Point b)
{
    return sqrt( (b - a)*(b - a) );
}

Line line[maxn];

bool check(Line l1,int n)
{
    if(sgn(dist(l1.s,l1.e)) == 0 )return false;
    for(int i = 0; i < n; i++)
        if(Seg_inter_line(l1,line[i]) == false)
            return false;
    return true;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            double a,b,c,d;
            scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
            line[i]=Line(Point(a,b),Point(c,d));
        }
        int flag=0;
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
            {
                if(check(Line(line[i].s,line[j].s),n)||check(Line(line[i].s,line[j].e),n)||
                        check(Line(line[i].e,line[j].s),n)||check(Line(line[i].e,line[j].e),n))
                    flag=1;
                if(flag)
                    break;
            }
        if(flag)
            printf("Yes!\n");
        else
            printf("No!\n");
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces-895B XK Segments

/** 题意:输入n,x,k; 和一个 n 长度的 序列 , 一个二元组的定义如下(i,j) 满足 ai...

Segments

1078. Segments Time limit: 1.0 second Memory limit: 64 MB A number of segments are lying ...

poj3304 Segments

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9898   Accep...
  • modiz
  • modiz
  • 2014年11月07日 16:42
  • 514

poj 3304 segments 计算几何

poj 3304 segments 计算几何 Given n segments in the two dimensional space, write a program, which determi...
  • k_l_c_
  • k_l_c_
  • 2016年07月25日 20:17
  • 310

Segments(计算几何基础)

题目来源: 作者: 题目: daim
  • npufz
  • npufz
  • 2014年08月19日 18:18
  • 259

XK Segments(二分)

http://codeforces.com/contest/895/problem/B 题目大意: n个数的序列  问任意 a[...

POJ3304---Segments (基础计算几何:叉积判断线段相交)

【题目来源】:https://vjudge.net/problem/POJ-3304 【题意】 给出n条线段的起始点坐标,然后问,有没有这样一条直线:所有线段在该直线上的投影至少有一个共同点。 ...

poj3304 计算几何 线段与直线相交

题意:给定n条线段,确定是否存在一条直线,使得这n条线段在这条直线上的射影具有公共点 可将问题转化为是否存在一条直线经过所有的线段,证明见依然的博客:http://blog.sina.com.cn/...

POJ3304(计算几何基础-判断线段与直线相交)

Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14774 Accepted: 46...

POJ3304 计算几何--判断直线与线段相交

0.0
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj3304 Segments(计算几何+直线相交)
举报原因:
原因补充:

(最多只允许输入30个字)