POJ3304:Segments——题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3304:Segments——题解相关的知识,希望对你有一定的参考价值。

http://poj.org/problem?id=3304

题目大意:给n条线段,求是否存在一条直线,将所有线段投影到上面,使得所有投影至少交于一点。

————————————————————————————

首先考虑当情况可能时,过相交点做垂线,则垂线一定与所有线相交。

所以就变成了求是否存在一条直线,使得直线和所有直线都相交的问题了。

显然如果存在这样的线,那么至少有一种情况,这样的线的两个端点是其中两条直线的任意两个端点。

那么枚举两个端点判断即可。

https://www.cnblogs.com/wuwangchuxin0924/p/6218494.html 如何判断两直线相交。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double dl;
const dl eps=1e-8;
const int N=101;
struct point{//既是向量又是点
    dl x;
    dl y;
}p[2*N];
int n;
inline point getmag(point a,point b){
    point s;
    s.x=b.x-a.x;s.y=b.y-a.y;
    return s;
}
inline dl multiX(point a,point b){
    return a.x*b.y-b.x*a.y;
}
bool check(point a,point b){
    if(fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps)return 0;  
    for(int i=1;i<=n;i++){  
    if(multiX(getmag(a,p[i]),getmag(a,b))*multiX(getmag(a,p[i+n]),getmag(a,b))>eps)return 0;
    }
    return 1;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+n].x,&p[i+n].y);
    }
    bool flag=0;
    for(int i=1;i<=2*n&&!flag;i++){
        for(int j=i+1;j<=2*n&&!flag;j++){
        if(check(p[i],p[j]))flag=1;
        }
    }
    if(flag)puts("Yes!");
    else puts("No!");
    }
    return 0;
}

 

以上是关于POJ3304:Segments——题解的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3304 Segments (线段和直线相交 + 思维)

poj 3304 Segments(计算几何基础)

POJ 3304 Segments

[POJ 3304]Segments

POJ-3304Segments[计算几何]

POJ 3304 Segments(计算几何:直线与线段相交)

(c)2006-2024 SYSTEM All Rights Reserved IT常识