Segments POJ 3304 直线与线段是否相交
题目大意:给出n条线段,问是否存在一条直线,使得n条线段在直线上的投影有至少一个公共点。
题目思路:如果假设成立,那么作该直线的垂线l,该垂线l与所有线段相交,且交点可为线段中的某两个交点
证明:若有l和所有线段相交,则可保持l和所有线段相交,左右平移l到和某一线段交于端点停止(“移不动了”)。然后绕这个交点旋转。也是转到“转不动了”(和另一线段交于其一个端点)为止。这样就找到了一个新的l满足题意,而且经过其中两线段的端点。
如何判断直线是否与线段相交:如果线段的两个端点在直线的两侧,那么线段与直线相交,因此可利用叉积来经行判断。
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0x3f3f3f3f #define MAX 100005 #define Temp 1000000000 #define MOD 1000000007using namespace std;int n;struct node {double x1,y1,x2,y2; }a[MAX];int check(int pos,double x1,double y1,double x2,double y2)//求叉积 {double x3=a[pos].x1,y3=a[pos].y1,x4=a[pos].x2,y4=a[pos].y2;if(fabs(x1-x2)<1e-8 && fabs(y1-y2)<1e-8)return 0;double op1=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);double op2=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);if(op1*op2 > (1e-8))return 0;return 1; }int Find(double x1,double y1,double x2,double y2) {for(int i=0;i<n;i++){if(!check(i,x1,y1,x2,y2))return 0;}return 1; }int solve() {for(int i=0;i<n;i++)//枚举端点 {for(int j=i+1;j<n;j++){if(Find(a[i].x1,a[i].y1,a[i].x2,a[i].y2))//上方线段return 1;if(Find(a[i].x1,a[i].y1,a[j].x1,a[j].y1))//两条线段左端连线return 1;if(Find(a[i].x1,a[i].y1,a[j].x2,a[j].y2))//两条线段左上右下连线return 1;if(Find(a[i].x2,a[i].y2,a[j].x1,a[j].y1))//两条线段右上左下连线return 1;if(Find(a[j].x1,a[j].y1,a[j].x2,a[j].y2))//下方线段return 1;if(Find(a[i].x2,a[i].y2,a[j].x2,a[j].y2))//两条线段有段连线return 1;}}return 0; }int main() {int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%lf%lf%lf%lf",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);}if(n<3)//如果有一个或两个线段特判一下 {printf("Yes!\n");continue;}int ok=solve();if(ok)printf("Yes!\n");elseprintf("No!\n");}return 0; }
View Code
转载于:https://www.cnblogs.com/alan-W/p/5978520.html
Segments POJ 3304 直线与线段是否相交相关推荐
- 判断直线与线段 是否相交 + 加入误差 故需要判断重点 poj 3304 Segments
题目来源:http://poj.org/problem?id=3304 分析: 题目大意:给出n条线段两个端点的坐标,问所有线段投影到一条直线上,如果这些所有投影至少相交于一点就输出Yes!,否则输出 ...
- Segments POJ - 3304(判断直线知否经过所有线段)
Segments POJ - 3304 题意:给n个线段的端点,问你将这些线段都投影到同一条直线上是否所有的线段都有交点. 思路:如果可以有一条直线可以穿过所有的线段的话那么就存在题意中的直线. #i ...
- poj 1039 Pipe (判断 直线和 线段 是否相交 并 求交点)
http://poj.org/problem?id=1039 题意:已知电缆是由一段段直的管道连接而成的,并知道这些管道的位置,问一束光从最左边射进来,你可以调节光入射的位置和角度,问最远能射到多远. ...
- 判断直线与线段是否相交,相交则输出交点x轴坐标
代码: int ControlFloat(double x)//精度控制 {if(fabs(x)<1e-11)return 0;return (x>0)?1:-1; }double Cha ...
- 点到线段直线的距离, 直线与直线的关系 直线与线段的关系
//代码参考与kuangbin的模板#include<bits/stdc++.h> using namespace std;const double eps = 1e-8; const d ...
- poj 3304 Segments (几何 : 线段 直线相交)
http://poj.org/problem?id=3304 题意:求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点. 题解": 1:把问题转化为是否存在一条直线与每条线段都有交 ...
- 【POJ - 3304 】Segments(计算几何,思想转化,直线和线段相交)
题干: Given n segments in the two dimensional space, write a program, which determines if there exists ...
- 判断线段和直线相交 POJ 3304
1 // 判断线段和直线相交 POJ 3304 2 // 思路: 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. 4 5 #include ...
- poj 3304 Segments
poj 3304 Segments (计算几何水题) 链接:http://poj.org/problem?id=3304 题意:找出一条直线,使得给出的所有线段在这个直线上的投影有交集. 思路:找出一 ...
最新文章
- 17个改变世界的数学公式,马斯克点赞
- JTAG error:can not read register while CPU is running该如何解决
- C++Builder中ListView控件用法和示例总结整理
- am5718_基于TI AM5718 车牌识别系统解决方案 - 飞凌嵌入式行业资讯 - 保定飞凌嵌入式技术有限公司...
- 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声
- F - Sugoroku2(动态规划)
- Oracle创建表空间及用户
- 关于 GraphQL 快速入门
- android xml反编译原理,记一次resources.arsc文件hex修改原理分析
- [BZOJ4303]数列
- 计算机软件企业所属行业性质,最新企业所属行业类别、分类及行业代码查询表.doc...
- python 下载股票数据_利用python下载股票交易数据
- 自写日历(周日历,农历节日节气)
- Linux E: 无法定位软件包
- python单位根检验看结果_时间序列的ADF检验(单位根检验)
- Oracle 创建用户授权视图,别名通过同义词解决
- maven deploy忽略指定模块module发布到私库
- IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51
- mysql查询周数_MySQL如何获取一个指定日期所对应本年度的周数(WEEK函数)呢?
- Clover 驱动文件夹_黑苹果(clover文件夹中各个文件的主要功能)