题目描述

线段和直线判交板子题

分析题目,如果存在这一条直线,那么过这条直线作垂线,一定有一条垂线穿过所有线段,否则不存在。题目转化为寻找一条直线与所有线段有交点。

直线线段判交方法:

1.先判断线段端点是否在直线上

2.如果端点不在直线上,则判断线段两端点是否分别位于直线两侧,做两次叉乘即可

考虑如何枚举直线。上述的这条垂线,如果在穿过所有线段的情况下将其平移,一定会碰到某条线段的端点;接着将其旋转一定角度,一定会碰到另一个端点。所以,只需枚举某两个端点构成的直线即可。时间复杂度O(n^3)

注意细节:

1.n=1时应输出Yes

2.两个端点相等(题目要求的范围内)时应跳过

具体实现见代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#define il inline
using namespace std;
struct point{
double x, y;
};
struct segment{
point l, r;
};
il double area(point p, point q, point s)
{
return p.x * q.y - p.y * q.x + q.x * s.y - q.y * s.x + s.x * p.y - s.y * p.x;
}
il bool toLeft(point p, point q, point s)
{
return area(p, q, s) > 0;
}
il bool check(segment a, segment l)
{
if (fabs(area(l.l, l.r, a.l)) <= 1e-6 || fabs(area(l.l, l.r, a.r)) <= 1e-6)
return 1;
return toLeft(l.l, l.r, a.l) != toLeft(l.l, l.r, a.r);
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
int T, n;
segment t;
cin >> T;
while (T--)
{
bool p = 0, ppp = 0;
cin >> n;
vector<segment> v;
vector<point> v2;
for (int i = 1; i <= n; ++i)
{
cin >> t.l.x >> t.l.y >> t.r.x >> t.r.y;
v.push_back(t);
v2.push_back(t.l);
v2.push_back(t.r);
}
if (n == 1)
{
cout << "Yes!\n";
continue;
}
for (int i = 0; i < v2.size(); ++i)
{
for (int j = 0; j < v2.size(); ++j)
{
p = 0;
t.l = v2[i];
t.r = v2[j];
if (fabs(t.l.x - t.r.x) < 1e-8 && fabs(t.l.y - t.r.y) < 1e-8)
continue;
for (int kk = 0; kk < v.size(); ++kk)
{
auto k = v[kk];
if (!check(k, t))
{
p = 1;
break;
}
}
if (!p)
{
cout << "Yes!\n";
ppp = 1;
break;
}
}
if (ppp)
break;
}
if (!ppp)
cout << "No!\n";
}
return 0;
}

题解 poj 3304的更多相关文章

  1. POJ 3304 Segments (判断直线与线段相交)

    题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...

  2. 判断线段和直线相交 POJ 3304

    // 判断线段和直线相交 POJ 3304 // 思路: // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. #include <cstdio ...

  3. POJ 3304 Segments 基础线段交判断

    LINK 题意:询问是否存在直线,使得所有线段在其上的投影拥有公共点 思路:如果投影拥有公共区域,那么从投影的公共区域作垂线,显然能够与所有线段相交,那么题目转换为询问是否存在直线与所有线段相交.判断 ...

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

    POJ 3304 Segments 大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点. 思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes ...

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

    POJ 3304  Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以 ...

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

    题目传送门:POJ 3304 Segments Description Given n segments in the two dimensional space, write a program, ...

  7. poj 3304线段与直线相交

    http://poj.org/problem?id=3304 Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: ...

  8. poj 3304 找一条直线穿过所有线段

    题目链接:http://poj.org/problem?id=3304 #include<cstdio> #include<cstring> #include<cmath ...

  9. [题解]poj 1274 The Perfect Stall(网络流)

    二分匹配传送门[here] 原题传送门[here] 题意大概说一下,就是有N头牛和M个牛棚,每头牛愿意住在一些牛棚,求最大能够满足多少头牛的要求. 很明显就是一道裸裸的二分图最大匹配,但是为了练练网络 ...

随机推荐

  1. 在VS2017中创建C++的代码块模板

    在VS2017中创建C++的代码块模板 有任何问题,请留言!!! 在VS2017中有工具–>代码片段管理器,方便我们使用固有的代码块模板,同时我们也可以自定义模板. 在VS2017中代码片段的模 ...

  2. iconfont - 好用免费的图标库

    某里出品 打开首页???????搜索框在哪里 网站:点我

  3. MapReduce之自定义分区器Partitioner

    @ 目录 问题引出 默认Partitioner分区 自定义Partitioner步骤 Partition分区案例实操 分区总结 问题引出 要求将统计结果按照条件输出到不同文件中(分区). 比如:将统计 ...

  4. 阿里P9又有新瓜吃咯,马云震怒!!

    自从蒋凡出轨事件曝光之后,阿里这各种瓜来得就像龙卷风,隔三差五的爆出员工出轨事件,普通员工.中层.高管全覆盖,早已集齐7颗阿里瓜瓜,可以召唤神龙了. 上次的出轨事件过去还没有一个月的时间,今天又爆出来 ...

  5. Mybatis——@MapperScan原理

    @MapperScan配置在@Configuration注解的类上会导入MapperScannerRegistrar类. 而MapperScannerRegistrar实现了ImportBeanDef ...

  6. Java Web(2)-jQuery下

    一.jQuery的属性操作 html() 它可以设置和获取起始标签和结束标签中的内容,跟 dom 属性 innerHTML 一样. text() 它可以设置和获取起始标签和结束标签中的文本, 跟 do ...

  7. 《Head First 设计模式》:抽象工厂模式

    正文 一.定义 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 要点: 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产品的具体产品是什么.这样 ...

  8. 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套

    先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:

  9. C/C++编程笔记:C++入门知识丨运算符重载

    本篇要学习的内容和知识结构概览 运算符重载使用场景 常规赋值操作 我们现在有一个类 想要实现这种赋值操作 具体实现如下: 所以说呢,我们在使用运算符进行运算的时候, 实际上也是通过函数来实现运算的. ...

  10. UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...