Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
哎 谁有聊能帮看下程序 wa爽了 注释已加#include<iostream> #include<cmath> #include<stdio.h> #include<algorithm> using namespace std; #define eps 1e-12 #define zero(x) (((x)>0?(x):-(x))<eps) struct Point { double x,y; }; struct Line { Point a,b; }; double xmult(Point p1,Point p2,Point p0)//叉× { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } double dmult(Point p1,Point p2,Point p0)//点乘 { return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y); } int dot_online_in(Point p,Line l)//判断点是否在线段上 { return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps; } int parallel(Line u,Line v)//判断是否平行 { return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y)); } Point intersection(Line u,Line v)//求2直线的交点 { Point 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; } int main() { int t; scanf("%d",&t); while(t--) { Point tmp;//记录2直线最高点较低的点 Point ko;//求平行直线后得到的交点 Line pall;//最后求平行x轴直线时求的直线 double ans=0; double x1,x2,y1,y2; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);//读入数据时把Y轴坐标高的放B点 if(y1>y2) { swap(y1,y2); swap(x1,x2); } Line l1,l2; l1.a.x=x1,l1.a.y=y1,l1.b.x=x2,l1.b.y=y2; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); if(y1>y2) { swap(y1,y2); swap(x1,x2); } l2.a.x=x1,l2.a.y=y1,l2.b.x=x2,l2.b.y=y2; if(parallel(l1,l2))//如果平行就无解退出 { printf("0.00\n"); } else { bool flag=true;//标记是否有垂直于x轴的边 Point p=intersection(l1,l2); if(dot_online_in(p,l1)&&(dot_online_in(p,l2)))//如果2直线的交点都不在直线上就退出 { double kl1,kl2;//l1, l2的斜率 if(l1.b.x-l1.a.x==0||l2.b.x-l2.a.x==0)//如果出现斜率无解就不计算斜率 { flag=false; } else { kl1=(l1.b.y-l1.a.y)/(l1.b.x-l1.a.x); kl2=(l2.b.y-l2.a.y)/(l2.b.x-l2.a.x); } if(flag&&kl1<0&&kl2<0&&l1.b.y>=l2.b.y&&l1.b.x<=l2.b.x)//下面4个if判断是否出现上板比下版长的情况 { printf("0.00\n"); } else if(flag&&kl1>0&&kl2>0&&l1.b.y>=l2.b.y&&l1.b.x>=l2.b.x) { printf("0.00\n"); } else if(flag&&kl2<0&&kl1<0&&l2.b.y>=l1.b.y&&l2.b.x<=l1.b.x) { printf("0.00\n"); } else if(flag&&kl2>0&&kl1>0&&l2.b.y>=l1.b.y&&l2.b.x>=l1.b.x) { printf("0.00\n"); } else if(l1.a.y==l1.b.y||l2.a.y==l2.b.y) { printf("0.00\n"); } else//当都满足时开始计算 { if(l1.b.y<l2.b.y) { tmp=l1.b; pall.a=tmp; pall.b.x=0; pall.b.y=tmp.y; ko=intersection(pall,l2); } else { tmp=l2.b; pall.a=tmp; pall.b.x=0; pall.b.y=tmp.y; ko=intersection(pall,l1); } //if(ko.x!=tmp.x) { ans=abs(ko.x-tmp.x)*(tmp.y-p.y)/2; } //else //{ //printf("0.00") printf("%.2lf\n",ans); } } else { printf("0.00\n"); } //cout<<p.x<<p.y<<endl; } //cout<<x1<<y1<<x2<<y2<<endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator