Pipe POJ - 1039(判断直线与线段的相交)

题目要求找出从管道左端射出的光线,以最大距离穿过管道。通过枚举上端和下端点组合,判断光线是否能穿过所有线段,找到最远的合法光线。若光线能穿过所有线段,表示无障碍;若不能,需判断终止位置以确定是否合法。最后计算交点距离以得出最远距离。
摘要由CSDN通过智能技术生成

Pipe POJ - 1039

题意:给出n个点,还有另外n个点是前者的y值-1,构成了一个管道,问从管道左端射出一道光线,角度调整为最优光线最远可以达到多远。

思路:最优的情况就是上端和下段的顶点至少都经过一次可以产生最优。所以思路就是枚举上下所有的点组合,然后判断合法的且最远的那一组就可以了。

首先让上下端点相连接,然后把枚举的光线穿过这些线段,如果全部可以穿过,那么证明光线没有阻挡,可以从这头跑到那头去,然后就是不能全部穿过的情况,如果停留在这一组光线的左端,那么证明这道光线不是从入口处射入的,是不合法的,如果是在光线的右端点停止的,那么就可以计算交点算距离就可以了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

#define eps 1e-8

double sgn(double x) {
   
	if(fabs(x) < eps) return 0;
	if(x < 0) return -1;
	else return 1;
}

struct Point {
    // 表示点
	double x, y;
	Point(){
   }
	Point(double _x,double _y) {
   
		x = _x; y = _y;
	}
	Point operator + (const Point& b) const {
   
		return Point(x + b.x,y + b.y);
	}
	Point operator - (const Point &b) const {
   
		return Point(x - b.x,y - b.y);
	}
	double operator * (const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值