直线的交点,题目不是很难,但还是太粗心,其中有一步疏忽,导致无限wa,最后还是发现了
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; const int maxn=10000; double eps=1e-10; struct node { double x1,x2,y; }; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y) {}; }; node arc[maxn],hou,line; int n; struct node2 { double l1,l2; }; node2 ran[maxn]; double max(double a,double b) { return a>b?a:b; } double cross(double x1,double y1,double x2,double y2) { return x1*y2-y1*x2; } double getIn(Point a,Point b) { double vx=b.x-a.x,vy=b.y-a.y; double wx=line.x2-line.x1,wy=0; double ux=a.x-line.x1,uy=a.y-line.y; double t=cross(wx,wy,ux,uy)/cross(vx,vy,wx,wy); return a.x+t*vx; } bool cmp(node2 a,node2 b) { return a.l1<b.l1; } double solve() { int i; int tot=0; for(i=0;i<n;i++) { if(!(arc[i].y>hou.y||arc[i].y<line.y)) { double l1=getIn(Point(hou.x1,hou.y),Point(arc[i].x2,arc[i].y)), l2=getIn(Point(hou.x2,hou.y),Point(arc[i].x1,arc[i].y)); if(l1<line.x1) l1=line.x1; if(l1>line.x2) l1=line.x2; if(l2<line.x1) l2=line.x1; if(l2>line.x2) l2=line.x2; ran[tot].l1=l2; ran[tot].l2=l1; tot++; } } sort(ran,ran+tot,cmp); double maxv=0; if(tot==0) return line.x2-line.x1;//思维不够严密,居然拉了这步,居然想了4个小时 if(ran[0].l1>line.x1) maxv=ran[0].l1-line.x1; double tem=ran[0].l2; for(i=1;i<tot;i++) { if(ran[i].l1>tem) { maxv=max(maxv,ran[i].l1-tem); tem=ran[i].l2; } else tem=max(tem,ran[i].l2); } maxv=max(maxv,line.x2-ran[tot-1].l2); return maxv; } int main() { while(scanf("%lf%lf%lf",&hou.x1,&hou.x2,&hou.y)) { if(hou.x1==0&&hou.x2==0&&hou.y==0) break; scanf("%lf%lf%lf",&line.x1,&line.x2,&line.y); int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf%lf",&arc[i].x1,&arc[i].x2,&arc[i].y); double ans=solve(); if(ans==0) printf("No View\n"); else printf("%.2lf\n",ans); } return 0; }