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