题目大意:给出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 1000000007 using 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- && fabs(y1-y2)<1e-)
return ;
double op1=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
double op2=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
if(op1*op2 > (1e-))
return ;
return ;
} int Find(double x1,double y1,double x2,double y2)
{
for(int i=;i<n;i++)
{
if(!check(i,x1,y1,x2,y2))
return ;
}
return ;
} int solve()
{
for(int i=;i<n;i++)//枚举端点
{
for(int j=i+;j<n;j++)
{
if(Find(a[i].x1,a[i].y1,a[i].x2,a[i].y2))//上方线段
return ;
if(Find(a[i].x1,a[i].y1,a[j].x1,a[j].y1))//两条线段左端连线
return ;
if(Find(a[i].x1,a[i].y1,a[j].x2,a[j].y2))//两条线段左上右下连线
return ;
if(Find(a[i].x2,a[i].y2,a[j].x1,a[j].y1))//两条线段右上左下连线
return ;
if(Find(a[j].x1,a[j].y1,a[j].x2,a[j].y2))//下方线段
return ;
if(Find(a[i].x2,a[i].y2,a[j].x2,a[j].y2))//两条线段有段连线
return ;
}
}
return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%lf%lf%lf%lf",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
}
if(n<)//如果有一个或两个线段特判一下
{
printf("Yes!\n");
continue;
}
int ok=solve();
if(ok)
printf("Yes!\n");
else
printf("No!\n");
}
return ;
}

Segments POJ 3304 直线与线段是否相交的更多相关文章

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

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

  2. poj 3304(直线与线段相交)

    传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...

  3. hdu 3304(直线与线段相交)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12042   Accepted: 3808 Descrip ...

  4. poj 3304 Segments(计算直线与线段之间的关系)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10921   Accepted: 3422 Descrip ...

  5. C - Segments POJ - 3304 (判断线段相交)

    题目链接:https://vjudge.net/contest/276358#problem/C 题目大意:给你n条线段,问你是否存在一条线段使得所有的线段在这条直线的投影至少具有一个交点? 具体思路 ...

  6. POJ 1039 直线和线段相交

    题意: 题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离. 分析: 光线一定经过一个上端点和一个下端点,这一点很容易想到.然后枚举上下端点即可 #include <iostream ...

  7. POJ 3304 Segments (直线与线段是否相交)

    题目链接 题意 : 能否找出一条直线使得所有给定的线段在该直线上的投影有一个公共点. 思路 : 假设存在一条直线a使得所有线段在该直线上的投影有公共点,则必存在一条垂直于直线a的直线b,直线b与所有线 ...

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

    题目大意:给出一些线段,然后判断这些线段的投影是否有可能存在一个公共点.   分析:如果这些线段的投影存在一个公共点,那么过这个公共点作垂线一定与所有的直线都想交,于是题目转化成是否存在一个直线可以经 ...

  9. POJ 3304 Segments (直线和线段相交判断)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7739   Accepted: 2316 Descript ...

随机推荐

  1. [ An Ac a Day ^_^ ] CodeForces 601A The Two Routes 最短路

    14号就ccpc全国赛的全国赛了 而且也快东北赛的选拔赛了 现在队伍实力实在不行 参加了也是边缘化的队伍 虽然有新生保护的设置 但实话说 机会还是不大 所以不如趁现在开始好好努力 明年也许还有机会 A ...

  2. Python多进程multiprocessing使用示例

    mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...

  3. Unity3D 回合制 网上源码 目前还在研究构思

    我们已将回合制的战斗模式讲解得很清楚了.那么,如果在Unity3D游戏中实现一个回合制游戏呢?我们从最简单的一对一模式来设计回合制游戏的原型.我们可以游戏的状态划分为下面三种状态:        1. ...

  4. html5+css3学习笔记音频和视频

    格式 IE Firefox Opera Chrome Safari Ogg No 3.5+ 10.5+ 5.0+ No MPEG 4 9.0+ No No 5.0+ 3.0+ WebM No 4.0+ ...

  5. pumping lemma for finite regular language?

    some books describe pumping lemma as this: Let L be a regular language. Then there exists an integer ...

  6. jquery的隐藏

    HTML 代码:<form> <input type="text" name="email" /> <input type=&qu ...

  7. 正则表达式判断ip地址

    html: <div class="configuration"><form action="" name="myformcon&q ...

  8. 安装、配置、启动FTP、SSH或NFS服务

    (1)准备使用软件维护工具apt-get. Ubuntu7.10中没有安装FTP.SSH.NFS服务器软件,它提供了一个很方便的安装.升级.维护软件的工具apt-get.apt-get从光盘.网络上下 ...

  9. (转载)测试工具monkey

    转自http://www.418log.org/post-32.html 1)进入shell 在桌面点开始--运行 输入cmd 点确定 或打开 cmd.exe 进入sdk tools目录如: 1 C: ...

  10. robotframework的分支和循环

    分支: run keyword if  | condition |  do something ...   |      else if | condition | do something ... ...