POJ 2074 Line of Sight(求交点)
2012-09-20 21:13
323 查看
题意:给你一段路,和一个房子,都是线段。之间有一些障碍物,在某些路段上可以看到整个房子,,问最长的路段多长。。。
思路:枚举每一个障碍物在路上的投影,求投影间的最大值。。
思路:枚举每一个障碍物在路上的投影,求投影间的最大值。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> using namespace std; const double EPS = 1e-6; bool zero(double t){return t>-EPS&&t<EPS;} struct cvector{ double x,y; cvector(double a,double b){x=a,y=b;} cvector(){} }; cvector operator+(cvector a,cvector b){ return cvector(a.x+b.x,a.y+b.y); } cvector operator-(cvector a,cvector b){ return cvector(a.x-b.x,a.y-b.y); } cvector operator*(double a,cvector b){ return cvector(a*b.x,a*b.y); } double operator*(cvector a,cvector b){ return a.x*b.x+a.y*b.y; } double operator^(cvector a,cvector b){ return a.x*b.y-b.x*a.y; } double length(double t){return t<0?-t:t;} double length(cvector t){return sqrt(t*t);} struct cpoint{ double x,y; cpoint(double a,double b){x=a,y=b;} cpoint(){} }; cvector operator-(cpoint a,cpoint b) { return cvector(a.x-b.x,a.y-b.y); } double dist(cpoint a,cpoint b){ return length(a-b); } struct cline{ cpoint a,b; cline(cpoint x,cpoint y){a=x,b=y;} cline(){} void get(){ scanf("%lf%lf%lf",&a.x,&b.x,&a.y),b.y=a.y; } }; cpoint intersect(cline u,cline v){ cpoint ret = u.a; double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x)) /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); ret.x+=(u.b.x-u.a.x)*t; ret.y+=(u.b.y-u.a.y)*t; return ret; } cline house,road; struct nod{ double l,r; bool operator<(const nod t) const{ return l<t.l; } } re[10009]; int main() { freopen("in.txt","r",stdin); cline tmp;int n;cpoint p; while(1) { house.get(); if(zero(house.a.x+house.a.y+house.b.x))break; road.get(); scanf("%d",&n); int cnt = 0; for(int i=0;i<n;i++) { tmp.get(); if(tmp.a.y>=house.a.y||tmp.a.y<=road.a.y) continue; p = intersect(road,cline(house.b,tmp.a)); re[cnt].l = p.x; p = intersect(road,cline(house.a,tmp.b)); re[cnt].r = p.x;cnt++; } sort(re,re+cnt); double ans = -1,a=road.a.x; for(int i=0;i<cnt;i++) { if(re[i].l>a) ans = max((min(re[i].l,road.b.x)-a),ans); a=max(re[i].r,a); } if(a<road.b.x) ans = max(ans,road.b.x-a); if(ans>=0) printf("%.2lf\n",ans); else printf("No View\n"); } return 0; }
相关文章推荐
- [poj] 2074 Line of Sight || 直线相交求交点
- poj 2074 Line of Sight(视线问题,求直线与线段的交点及判断相交)
- 简单几何(直线求交点) POJ 2074 Line of Sight
- POJ 2074 Line of Sight(判线段与直线相交)
- poj 2074 Line of Sight
- POJ 2074 Line of Sight
- poj 2074 Line of Sight
- POJ 2074 Line of Sight 直线交
- POJ 2074 Line of Sight 计算几何
- POJ 2074 Line of Sight
- POJ 2074 Line of Sight
- poj 2074 Line of Sight
- poj 2074 Line of Sight
- poj 2074 Line of Sight
- Poj 2074 Line of Sight
- Poj 2074 Line of Sight
- POJ 2074 Line of Sight
- poj 2074 Line of Sight(计算几何)
- POJ 2074 Line of Sight
- poj 2074 Line of Sight (计算几何,细节题)