An Easy Problem?!--
没过 没过 啊啊啊 wa到死
http://poj.org/problem?id=2826
我的错误代码
先不写了!!!!!!!
#include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> #include<string.h> #include<stdlib.h> #include<ctype.h> using namespace std; #define INF 0xfffffff #define ESP 1e-8 #define memset(a,b) memset(a,b,sizeof(a)) #define N 10 struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){} Point operator - (const Point &t)const{ return Point(x-t.x,y-t.y); } int operator * (const Point &temp)const{ double t=(x*temp.y-y*temp.x); if(t>ESP) return 1; if(fabs(t)<ESP) return 0; return -1; } }t; struct node { Point A,B; node(Point A=0,Point B=0):A(A),B(B){} }; int jiao(node a,node b) { int k1=(b.A-a.A)*(a.B-a.A)+(b.B-a.A)*(b.B-a.A); int k2=(a.A-b.A)*(b.B-b.A)+(a.B-b.A)*(b.B-b.A); if(k1==2 || k2==2) return false; return true; } int gongxian(node a,node b) { int k1=(b.A-a.A)*(a.B-a.A); int k2=(b.B-a.A)*(b.B-a.A); if(k1==0 && k2==0) return true; return false; } int fugai(double x1,double x2,double y1,double y2) { Point p,q; p=Point(x1,y1); q=Point(x2,y2); int k1=(p-t)*(q-t); int k2=(q-t)*(p-t); if(t.x<=x1) { if(x1>=x2 && y1>y2 && (k2==1 || k2==0)) return true; else if(x2>=x1 && y2>y1 && (k1==1 || k1==0)) return true; } else if(t.x>=x1) { if(x1<=x2 && y1>y2 && (k2==-1 || k2==0)) return true; else if(x2<=x1 && y2>y1 && (k1==-1 || k1==0)) return true; } return false; } Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板 { Point ret=u1; double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x)); ret.x+=(u2.x-u1.x)*t; ret.y+=(u2.y-u1.y)*t; return ret; } int main() { int T; scanf("%d",&T); while(T--) { double ans=0.00; node a[N]; Point p[N]; memset(a,0); memset(p,0); double x1,x2,x3,x4,y1,y2,y3,y4; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4); if(y1<y2) { swap(x1,x2); swap(y1,y2); } if(y3<y4) { swap(x3,x4); swap(y3,y4); } p[1]=Point(x1,y1); p[2]=Point(x2,y2); p[3]=Point(x3,y3); p[4]=Point(x4,y4); a[1]=node(Point(x1,y1),Point(x2,y2)); a[2]=node(Point(x3,y3),Point(x4,y4)); ///判断是否与x轴平行 if(fabs(y1-y2)<ESP || fabs(y3-y4)<ESP) { printf("%.2f\n",ans+ESP); continue; } ///判断相交 if(!jiao(a[1],a[2])) { printf("%.2f\n",ans+ESP); continue; } ///判断共线 if(gongxian(a[1],a[2])) { printf("%.2f\n",ans+ESP); continue; } ///判断覆盖 t=line(p[1],p[2],p[3],p[4]); if(fugai(x1,x3,y1,y3)) { printf("%.2f\n",ans+ESP); continue; } else { double y=min(y1,y3); double xx1=(x2-x1)*(y-y1)/(y2-y1)+x1; double xx2=(x4-x3)*(y-y3)/(y4-y3)+x3; double S=fabs((y-t.y)*(xx2-t.x)-(xx1-t.x)*(y-t.y))/2.0; printf("%.2f\n",S+ESP); } } return 0; }