POJ 1039 直线和线段相交
题意:
题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离。
分析:
光线一定经过一个上端点和一个下端点,这一点很容易想到。然后枚举上下端点即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define eps 1e-8
#define INF 1e9
#define OK sgn(tmp-lx1)>0 && sgn(tmp-lx2<0)
using namespace std; typedef struct Point
{
double x,y;
Point() {};
Point(double xx,double yy)
{
x=xx;
y=yy;
}
} Vector; struct Line
{
Point p,q;
Line() {};
Line(Point pp,Point qq)
{
p=pp;
q=qq;
}
}; int sgn(double x)
{
if(fabs(x)<eps) return 0;
return x<0? -1:1;
} double crs_prdct(Vector a,Vector b)
{
return a.x*b.y-b.x*a.y;
} Vector operator - (Point a,Point b)
{
return Vector(a.x-b.x,a.y-b.y);
} double cross_x(Point p1,Point p2,Point p3,Point p4)
{
double k1=(p1.y-p2.y)/(p1.x-p2.x);
double k2=(p3.y-p4.y)/(p3.x-p4.x);
return (k1*p1.x-k2*p3.x-p1.y+p3.y)/(k1-k2);
} double get_y(Point p,Point q,double x)
{
return (p.y-q.y)/(p.x-q.x)*(x-p.x)+p.y;
} //判断直线和线段相交
bool Seg_inter_line(Line l1,Line l2) //判断直线l1和线段l2是否相交,<0是把交于线段端点处看做不相交
{
return sgn(crs_prdct(l2.p-l1.q,l1.p-l1.q))*sgn(crs_prdct(l2.q-l1.q,l1.p-l1.q)) < 0;
} const int maxn=30;
Point Up[maxn],Dw[maxn]; int main()
{
// freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n),n)
{
double x,y;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&x,&y);
Up[i]=Point(x,y);
Dw[i]=Point(x,y-1);
}
double ans=Up[0].x;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j) continue;
for(int k=0; k<n-1; k++)
{
if(Seg_inter_line(Line(Up[i],Dw[j]),Line(Up[k],Up[k+1])))
{
ans=max(ans,cross_x(Up[i],Dw[j],Up[k],Up[k+1]));
break;
}
if(Seg_inter_line(Line(Up[i],Dw[j]),Line(Dw[k],Dw[k+1])))
{
ans=max(ans,cross_x(Up[i],Dw[j],Dw[k],Dw[k+1]));
break;
}
double t=get_y(Up[i],Dw[j],(Up[k].x+Up[k+1].x)/2);
if(t>(Up[k].y+Up[k+1].y)/2 || t<(Dw[k].y+Dw[k+1].y)/2)
{
ans=max(ans,Up[k].x);
break;
}
if(k==n-2) ans=Up[n-1].x;
}
}
}
if(sgn(ans-Up[n-1].x)==0) printf("Through all the pipe.\n");
else printf("%.2f\n",ans);
}
return 0;
}
POJ 1039 直线和线段相交的更多相关文章
- poj 3304(直线与线段相交)
传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...
- POJ 1039 Pipe 枚举线段相交
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9493 Accepted: 2877 Description ...
- POJ 1039 Pipe(直线和线段相交判断,求交点)
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8280 Accepted: 2483 Description ...
- 判断直线与线段相交 POJ 3304 Segments
题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点. 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交. 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1 ...
- hdu 3304(直线与线段相交)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12042 Accepted: 3808 Descrip ...
- 简单几何(直线与线段相交) POJ 1039 Pipe
题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. ...
- POJ 3304 Segments(计算几何:直线与线段相交)
POJ 3304 Segments 大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点. 思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes ...
- POJ 3304 Segments 判断直线和线段相交
POJ 3304 Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以 ...
- POJ 3304 Segments (判断直线与线段相交)
题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...
随机推荐
- STM8的AIR与STM32的Keil的指定地址存数据
[经验分享]KE02在IAR和KEIL中以常量形式初始化EEPROM值一, 经验分享描述 写这篇经验分享的原因是,之前有一个客户,他希望在KE02的芯片中,不要出现使用EEPROM操作命 ...
- python工业互联网应用实战16-前后端分离模式之修改与删除
前一章节介绍了List页面的JQuery技术栈的迁移,这一章节我们花一些篇幅来说说修改/查看页面的技术栈迁移.相对于List的获取数据,修改页面涉及到数据Post提交到后台更新数据库.我们仍旧小步迭代 ...
- 【大咖直播】Elastic 可观测性实战工作坊
Elastic 的可观测性解决方案是基于 Elastic Stack 的一站式解决方案.该解决方案具有完备的日志.指标.APM 和可用性采集能力,可以在大规模和云原生的环境下完成基于服务质量目标的管理 ...
- .NET6系列:C#10新功能预览
系列目录 [已更新最新开发文章,点击查看详细] 2021年4月19日微软发布公告称将于今年夏季发布首款64位的 Visual Studio 2022,2021年5月20日又发布了 Visual ...
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- [leetcode] 36. 有效的数独(Java)
没啥好说的,直接上就行 36. 有效的数独 class Solution { public boolean isValidSudoku(char[][] board) { Map<Charact ...
- 调试动态加载的js
用浏览器无法调试异步加载页面里包含的js文件.简单的说就是在调试工具里面看不到异步加载页面里包含的js文件 最近在一个新的web项目中开发功能.这个项目的管理界面有一个特点,框架是固定的,不会刷新 ...
- Netty 框架学习 —— 传输
概述 流经网络的数据总是具有相同的类型:字节,这些字节如何传输主要取决于我们所说的网络传输.用户并不关心传输的细节,只在乎字节是否被可靠地发送和接收 如果使用 Java 网络编程,你会发现,某些时候当 ...
- Qt信号槽机制理解
1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...
- 九、Nginx常见问题处理
优化Nginx并发量 优化软件进程数.优化软件最大并发连接数限制.优化内核连接数限制open files(临时和永久同时设置) [root@proxy ~]# ab -n 2000 -c 2000 ...