Segments---poj3304(判断直线与线段的位置关系)

题目链接:http://poj.org/problem?id=3304

题意:给你n个线段,求是否有一条直线与所有的线段都相交,有Yes,没有No;

枚举所有的顶点作为直线的两点,然后判断这条直线是否和所有的线段相交即可;注意不能找两个相同的点作为直线上的两点;

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define mod 1000000007
typedef long long LL;
const int N = 5050;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;

struct point
{
    double x, y;
    point(double x=0, double y=0) : x(x), y(y) {}
    friend point operator -(point p1, point p2)
    {
        return point(p1.x-p2.x, p1.y-p2.y);
    }
    friend int operator ^(point p1, point p2)
    {
        double k = p1.x*p2.y - p1.y*p2.x;

        if(k > eps) return 1;
        if(fabs(k) < eps) return 0;
        return -1;
    }
    friend int operator ==(point p1, point p2)
    {
        return (p1.x == p2.x && p1.y == p2.y);
    }
}p[N];

struct line
{
    point s, e;
    line(point s=0, point e=0) : s(s), e(e) {}
}Line[N];

int Judge(line l, line L[], int n)
{
    for(int i=1; i<=n; i++)
    {
        int k = abs( ((l.s-l.e)^(L[i].s-l.e)) + ((l.s-l.e)^(L[i].e-l.e)) );
        ///判断直线l是否与线段L[i]相交;
        if(k == 2) return 0;///不相交;
    }
    return 1;
}

int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        met(p, 0);
        met(Line, 0);

        int k = 0;
        scanf("%d", &n);
        for(int i=1; i<=n; i++)
        {
            double x1, x2, y1, y2;
            scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
            p[k++] = point(x1, y1);
            p[k++] = point(x2, y2);
            Line[i] = line(p[k-2], p[k-1]);
        }
        int flag = 0;
        for(int i=0; i<k && !flag; i++)
        {
            for(int j=0; j<i && !flag; j++)
            {
                if(p[i] == p[j]) continue;
                flag = Judge(line(p[i], p[j]), Line, n);
            }
        }
        if(flag) puts("Yes!");
        else puts("No!");
    }
    return 0;
}

时间: 2024-08-25 08:05:04

Segments---poj3304(判断直线与线段的位置关系)的相关文章

POJ 3304 Segments(判断直线与线段是否相交)

http://poj.org/problem?id=3304 等价于是否存在一条直线穿过所有线段 判断直线与线段是否相交: 首先用两点p1,p2确定了一条直线 在用p1,p2分别与计算线段两个端点计算叉乘即可 ,叉乘之积>0就说明线段两端点在直线的同侧,也就是直线不经过此线段 注意顺序不要搞反了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #incl

Cupid&#39;s Arrow---hdu1756(判断点与多边形的位置关系 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n): 射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正 确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从点出 发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在 多边形边上时,如果是奇数,那么点就一定在多边形内部,否

POJ 3304 Segments 判断直线和线段相交

POJ 3304  Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以在那里作一条线,那么这条线就和所有线段都至少有一个交点,所以如果有一条直线和所有线段都有交点的话,那么就一定有解. 怎么确定有没直线和所有线段都相交?怎么枚举这样的直线?思路就是固定两个点,这两个点在所有线段上任意取就可以,然后以这两个点作为直线,去判断其他线段即可.为什么呢?因为如果有直线和所有线段都相

POJ-2318 TOYS 计算几何 判断点在线段的位置

题目链接:https://cn.vjudge.net/problem/POJ-2318 题意 在一个矩形内,给出n-1条线段,把矩形分成n快四边形 问某些点在那个四边形内 思路 二分+判断点与位置关系 提交过程 WA*n x1和x2,y1和y2在复制的时候没分清(哭 WA 可能存在二分问题? AC 代码 #define PI 3.1415926 #include <cmath> #include <cstdio> #include <vector> #include &

LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边形的内部; 射线法判断即可适用于任何(凸或凹)多边形;时间复杂度为O(n); 判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n):射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从

[poj2318]TOYS(直线与点的位置关系)

解题关键:计算几何入门题,通过叉积判断. 两个向量的关系: P*Q>0,Q在P的逆时针方向: P*Q<0,Q在P的顺时针方向: P*Q==0,Q与P共线. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> using namespace std; typede

poj3304计算几何直线与线段关系

Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common. Input Input begins with a number T show

POJ 2074 /// 判断直线与线段相交 视野盲区

题目大意: 将所有物体抽象成一段横向的线段 给定房子的位置和人行道的位置 接下来给定n个障碍物的位置 位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的 求最长的能看到整个房子的一段人行道的长度 若不在 y(房子)和y(人行道)之间的 不会有视野的阻碍 注意边界处理 因为盲区可能包含在人行道内 也可能超出 #include <cstdio> #include <algorithm> #include <cmath> using namespace st

[fzu 2273]判断两个三角形的位置关系

首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.php?pid=2273 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const double eps=1e-8; const