<题目链接>

题目大意:

给出一些线段,判断是存在直线,使得该直线能够经过所有的线段。、

解题思路:

如果有存在这样的直线,过投影相交区域作直线的垂线,该垂线必定与每条线段相交,问题转化为问是否存在一条线和所有线段相交。

如果存在这么一条直线,那么该直线一定能够移成经过两个端点的形式。枚举所有线段的两个端点,判断该直线和所有线段是否相交即可。
#include <iostream>
#include <math.h>
#include <cstdio>
using namespace std;
#define MAXM 110
#define EPS 1e-8 //10的负8次方 typedef struct{
double x1,y1,x2,y2;
}Segment; //线段 Segment segment[MAXM];
int n; double distance(double x1,double y1,double x2,double y2){ //计算两点之间距离
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} double corss(double x1,double y1,double x2,double y2,double x,double y){
return (x2-x1)*(y-y1)-(x-x1)*(y2-y1); //返回 (x2-x1,y2-y1) , (x-x1,y-y1)这两个向量的叉乘
} //根据的是(x,y)叉乘(b.x,b.y)=(x*b.y-y*b.x)公式;这个公式也可以通过三维向量叉乘的行列式得到,只不过要将这两个向量的Z坐标看成0 bool judge(double x1,double y1,double x2,double y2){
int i;
if(distance(x1,y1,x2,y2)<EPS) return ;
for(i=;i<n;i++){ //之所以是>ERS(ERS为无穷小),是因为若当前线段有一个端点是该分割线段的一个端点,此时答案应该是0,然而实际上0也是可以的,所以将ERS设为无穷小
if(corss(x1,y1,x2,y2,segment[i].x1,segment[i].y1)*corss(x1,y1,x2,y2,segment[i].x2,segment[i].y2)>EPS) return ;
//判断segment线段的两个端点是否置于该直线的两端
}
return ;
} int main(){
int t,i,j,flag;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%lf%lf%lf%lf",&segment[i].x1,&segment[i].y1,&segment[i].x2,&segment[i].y2);
if(n==) {printf("Yes!\n");continue;} flag=;
for(i=;i<n && !flag;i++){
for(int j=i+;j<n && !flag;j++){ //以任意两条线段的两个端点构成分割线,只要任意一条这样的分割线能够经过每一条线段,那么输出Yes
if(judge(segment[i].x1,segment[i].y1,segment[j].x1,segment[j].y1) ||
judge(segment[i].x1,segment[i].y1,segment[j].x2,segment[j].y2) ||
judge(segment[i].x2,segment[i].y2,segment[j].x1,segment[j].y1) ||
judge(segment[i].x2,segment[i].y2,segment[j].x2,segment[j].y2))
flag=;
}
}
if(flag) printf("Yes!\n");
else printf("No!\n");
}
return ;
}

2018-08-01

POJ 3304 Segments (叉乘判断线段相交)的更多相关文章

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

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

  2. POJ 2826 An Easy Problem? 判断线段相交

    POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...

  3. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  4. POJ 2653 Pick-up sticks(判断线段相交)

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7699   Accepted: 2843 De ...

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

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

  6. POJ 1066 - Treasure Hunt - [枚举+判断线段相交]

    题目链接:http://poj.org/problem?id=1066 Time Limit: 1000MS Memory Limit: 10000K Description Archeologist ...

  7. POJ 2653 - Pick-up sticks - [枚举+判断线段相交]

    题目链接:http://poj.org/problem?id=2653 Time Limit: 3000MS Memory Limit: 65536K Description Stan has n s ...

  8. nyoj-1016-德莱联盟(向量叉乘判断线段相交)

    叉乘的坐标表示: A(X1,Y1), B(X2, Y2), C(XC,YC), D(XD, YD);AB = (X2-X1, Y2-Y1);CD = (XD-XC, YD-YC); 向量AB,CD的叉 ...

  9. 【POJ 1556】The Doors 判断线段相交+SPFA

    黑书上的一道例题:如果走最短路则会碰到点,除非中间没有障碍. 这样把能一步走到的点两两连边,然后跑SPFA即可. #include<cmath> #include<cstdio> ...

随机推荐

  1. luogu P2123 皇后游戏

    传送门 跟国王游戏一样的分析 考虑相邻的两个大臣,设他们前面的\(\sum a_j\)为\(s\),同时注意到后面人的贡献更大 所以\(i\)在前面时,\(c_j=\max(\max(c_{last} ...

  2. Http协议的理解

    作者技术有限,这篇博文都是结合网上的文章和自己的理解而写的,若存在错误,请无私指出,十分感谢! 协议,就是一种标准,即大家都要遵守的标准. 举个简单的例子:在中国,几乎人人都会讲普通话,不同地区的人有 ...

  3. iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/

    iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...

  4. php封装的sqlite操作类

    sqlite在php中是默认安装的本地小型化数据库,类似于xml的小型数据库,但sqlite功能更强. sqlite.class.php文件: <?php class sqliteDB{ pri ...

  5. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  6. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

  7. html的结构-厂子型的布局

    上图所示的布局设计是很常见的.这个该怎么做呢? 技术需求:header 要固定住在顶部,不随鼠标滚动而向上移动:左边的div的有一定的宽度,但是要贴浏览器的底部(屏幕顶部):右边的dv要占据右边的全屏 ...

  8. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  9. PHP 发送HTTP请求的几种方式

    1.curl仍然是最好的HTTP库,没有之一. 可以解决任何复杂的应用场景中的HTTP 请求2. 文件流式的HTTP请求比较适合处理简单的HTTP POST/GET请求,但不适用于复杂的HTTP请求3 ...

  10. 造轮子和用轮子:快速入门JavaScript模块化

    造轮子和用轮子:快速入门JavaScript模块化 前言 都说“不重复造轮子”,就像iPhone——它除了打电话还可以播放音乐——但是工程师不用从零开始做一个音乐播放功能,也许只要在iPhone的系统 ...