博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3304 Segments
阅读量:4918 次
发布时间:2019-06-11

本文共 1470 字,大约阅读时间需要 4 分钟。

题目描述:

题解:

计算几何,坑点极多。

首先很明显存在一条直线穿过所有线段即$Yes$。

考虑枚举任意两个端点。

注意同一条线段上的也要枚举!

注意$eps=1e-8$!

注意两点重合就不用判了!

代码:

#include
#include
#include
#include
using namespace std;const int N = 150;const double eps = 1e-8;struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} Point operator - (const Point&a)const{
return Point(x-a.x,y-a.y);} double operator ^ (const Point&a)const{
return x*a.y-y*a.x;}};typedef Point Vector;struct Line{ Point p; Vector v; Line(){} Line(Point p,Vector v):p(p),v(v){}};int n;Point s[N][2];int dcmp(double x){ if(fabs(x)
0?1:-1;}bool diff(Line l,Point a,Point b){ return dcmp(l.v^(a-l.p))*dcmp(l.v^(b-l.p))<=0;}int check(Point a,Point b){ if(!dcmp(a.x-b.x)&&!dcmp(a.y-b.y))return 0; Line l = Line(a,b-a); for(int i=1;i<=n;i++) if(!diff(l,s[i][0],s[i][1]))return 0; return 1;}void work(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&s[i][0].x,&s[i][0].y,&s[i][1].x,&s[i][1].y); int FG = 0; for(int i=1;!FG&&i<=n;i++)for(int j=i;!FG&&j<=n;j++) if(check(s[i][0],s[j][0])||check(s[i][0],s[j][1])||check(s[i][1],s[j][0])||check(s[i][1],s[j][1]))FG=1; puts(FG?"Yes!":"No!");}int T;int main(){ scanf("%d",&T); while(T--)work(); return 0;}
View Code

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10981368.html

你可能感兴趣的文章
对象序列化
查看>>
UVA 208 Firetruck (DFS+剪枝)
查看>>
windows设置电脑的固定IP
查看>>
Python
查看>>
犀牛Phinoceros 如何切换中文语言
查看>>
Win7如何解决精简版的迅雷7无法运行
查看>>
C#.NET常见问题(FAQ)-如何判断某个字符是否为汉字
查看>>
直接用postman测试api ,服务器端没提供跨域也可以访问。
查看>>
数据的类型以及内置方法
查看>>
继承之super关键字的使用
查看>>
XML - 报表数据的新大陆
查看>>
echart在X轴下方添加字
查看>>
Map集合的两种取出方式
查看>>
GridView,Repeater增加自动序号列
查看>>
SMO算法精解
查看>>
第k小元素学习记录
查看>>
avi文件格式详解【转】
查看>>
django
查看>>
Java学习从入门到精通
查看>>
查找目录下的所有文件中是否含有某个字符串 linux
查看>>