题目大意:

将所有物体抽象成一段横向的线段

给定房子的位置和人行道的位置

接下来给定n个障碍物的位置

位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的

求最长的能看到整个房子的一段人行道的长度

若不在 y(房子)和y(人行道)之间的 不会有视野的阻碍

注意边界处理 因为盲区可能包含在人行道内 也可能超出

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; const double eps=1e-;
double add(double a,double b) {
if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
return a+b;
}
struct P {
double x,y;
P(){};
P(double _x,double _y):x(_x),y(_y){};
P operator - (P p) {
return P(add(x,-p.x),add(y,-p.y)); }
P operator + (P p) {
return P(add(x,p.x),add(y,p.y)); }
P operator * (double d) {
return P(x*d,y*d); }
double dot(P p) {
return add(x*p.x,y*p.y); }
double det(P p) {
return add(x*p.y,-y*p.x); }
};
struct Line{
P s,e;
Line(){};
Line(P _s,P _e):s(_s),e(_e){};
}H, L, p[]; bool cmp(Line a,Line b) {
if(a.s.x==b.s.x) return a.e.x<b.e.x;
return a.s.x<b.s.x;
}
// 求直线ab与直线cd的交点
P ins(P a,P b,P c,P d) {
return a+(b-a)*((d-c).det(c-a)/(d-c).det(b-a));
}
// 判断c点是否在线段ab上
bool onSeg(P a,P b,P c) {
return (a-c).det(b-c)== && (a-c).dot(b-c)<=;
} int main()
{
double a,b,c;
while(~scanf("%lf%lf%lf",&a,&b,&c)) {
if(a== && b== && c==) break; H.s.x=a, H.e.x=b, H.s.y=H.e.y=c; // 房子
scanf("%lf%lf%lf",&a,&b,&c);
L.s.x=a, L.e.x=b, L.s.y=L.e.y=c; // 人行道 int n,cnt=; scanf("%d",&n);
double up=max(H.s.y,L.s.y);
double dw=min(H.s.y,L.s.y);
for(int i=;i<n;i++) {
scanf("%lf%lf%lf",&a,&b,&c);
if(c>=up || c<=dw) continue;
// 不在房子和人行道之间的范围 不会有影响
p[cnt].s.x=a, p[cnt].e.x=b;
p[cnt].s.y=p[cnt].e.y=c; cnt++;
}
sort(p,p+cnt,cmp);
double lastX=L.s.x, ans=;
for(int i=;i<cnt;i++) {
P x1=ins(H.e,p[i].s,L.s,L.e);
// 房子右端连障碍左端 与 人行道 的交点
P y1=ins(H.s,p[i].e,L.s,L.e);
// 房子左端连障碍右端 与 人行道 的交点
if(onSeg(L.s,L.e,x1))
ans=max(ans,x1.x-lastX);
// 盲区为x1-y1 若这段盲区的起点在人行道上
// 那么盲区左端之前存在一段 更新答案
lastX=max(lastX,y1.x);
// 下一段的开端是位于盲区的右端
}
if(lastX<L.e.x) ans=max(ans,L.e.x-lastX);
// 最后一段盲区位于人行道内 那么盲区之后还有一段 if(ans) printf("%.2f\n",ans);
else printf("No View\n");
} return ;
}
/*discuss里的大神们提供的经典测试数据
2 6 6
0 15 0
3
1 2 1
3 4 1
12 13 1 1 5 5
0 10 0
1
0 15 1 2 6 6
0 15 0
3
1 2 1
3 4 1
12 13 1 2 6 6
0 15 0
4
1 2 1
3 4 1
12 13 1
1 5 2 2 6 6
0 15 0
2
0 5 3
6 15 3 2 6 6
0 15 0
2
6 10 1
0 2 1 2 6 6
0 15 0
1
2 6 7 2 6 6
0 15 0
1
4 4.5 5.5 2 6 6
0 15 0
16
0 1 3
1.5 2 3
2.5 3 3
3.5 4 3
4.5 5 3
5.5 6 3
6.5 7 3
7.5 8 3
8.5 9 3
9.5 10 3
10.5 11 3
11.5 12 3
12.5 13 3
13.5 14 3
14.5 15 3
15.5 16 3 2 6 6
0 15 0
16
0 1 .1
1.5 2 .1
2.5 3 .1
3.5 4 .1
4.5 5 .1
5.5 6 .1
6.5 7 .1
7.5 8 .1
8.5 9 .1
9.5 10 .1
10.5 11 .1
11.5 12 .1
12.5 13 .1
13.5 14 .1
14.5 15 .1
15.5 16 .1 2 6 6
0 15 0
14
0 1 3
1.5 2 3
2.5 3 3
3.5 4 3
4.5 5 3
5.5 6 3
8.5 9 3
9.5 10 3
10.5 11 3
11.5 12 3
12.5 13 3
13.5 14 3
14.5 15 3
15.5 16 3 2 6 6
0 4000000000 0
2
1 2 1
15 16 3 2 6 6
0 15 1
5
1 1.5 6
17 18 1
3 5 3
0 20 10
0 20 0.5
*//*
答案:
8.80
No View
8.80
6.70
No View
4.00
15.00
No View
No View
0.44
1.00
3999999970.00
8.00
*/

POJ 2074 /// 判断直线与线段相交 视野盲区的更多相关文章

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

    题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点. 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交. 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1 ...

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

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

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

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

  4. POJ 3304 Segments[直线与线段相交]

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13514   Accepted: 4331 Descrip ...

  5. poj3304(叉积判断直线和线段相交)

    题目链接:https://vjudge.net/problem/POJ-3304 题意:求是否能找到一条直线,使得n条线段在该直线的投影有公共点. 思路: 如果存在这样的直线,那么在公共投影点作直线的 ...

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

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

  7. POJ 1039 Pipe(直线和线段相交判断,求交点)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8280   Accepted: 2483 Description ...

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

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

  9. POJ 1039 直线和线段相交

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

随机推荐

  1. 关于canvas绘制图像模糊问题

    前段时间在做项目的裁剪并上传图像功能的时候,发现裁剪后展示的图像比较模糊,之后去百度上搜索了一下,看到有一个解决方案是设置canvas的宽高为css宽高的3倍,使用后感觉效果很好,当时就没管原理接着做 ...

  2. jQuery的两把利器

    1 jQuery核心函数 * 简称: jQuery函数($/jQuery) * jQuery库向外直接暴露的就是$/jQuery * 引入jQuery库后, 直接使用$即可 * 当函数用: $(xxx ...

  3. usb基础知识以及枚举过程介绍

    一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符:而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符:在接口描述符里面又定 ...

  4. poj 3254 Corn Field

    Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...

  5. P2004 领地选择

    P2004 领地选择 题目描述 作为在虚拟世界里统帅千军万马的领袖,小Z认为天时.地利.人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小T来说是非常重要的. 首都被认为是一个占地C*C的正方形. ...

  6. PMP-49个过程快速导览

    启动过程组 名正言顺 人鬼佛神 01 -4.1制定项目章程 -授权PM,启动项目 ● 编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程 ● 明确项目与组织战略目标之间的联系,确立 ...

  7. Java 网络编程(1):使用 NetworkInterface 获得本机在局域网内的 IP 地址

    原文地址:https://segmentfault.com/a/1190000007462741 1.问题提出 在使用 Java 开发网络程序时,有时候我们需要知道本机在局域网中的 IP 地址.很常见 ...

  8. php连接docker启动的mysql容器报错:(HY000/2002): Connection refused的解决办法

    vim libraries/config.default.php 查找到localhost/127.0.0.1字符[一般来说默认都是localhost] :/localhost 替换成容器名,例如我定 ...

  9. Python服务端工程师就业面试指导✍✍✍

    Python服务端工程师就业面试指导  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...

  10. java-day13

    异常 指的是程序在执行过程中,出现的非正常情况,最终会导致JVM的非正常停止 异常分类:编译异常,运行期异常 异常的产生过程分析 throw关键字:指方法中抛出指定异常 使用格式:throw new ...