| ||||||||||
| 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 | |||||||||
Re:2826 到底是怎么回事 少考虑了什么条件。。。。。。。。。。。。。。。。!!!!HELPIn Reply To:2826 到底是怎么回事 少考虑了什么条件。。。。。。。。。。。。。。。。!!!!HELP Posted by:Lodestar at 2006-04-28 22:56:01 我测试通过了,自己写的一些特殊情况的测试也通过了,还是wr,麻烦给看一下各位。我写的是任何情况下的两条线段都可以计算的,包含了两块板相同长度的情况啊!
#include<stdio.h>
#include<math.h>
int main(){
int x1,y1,x2,y2,x3,y3,x4,y4,t;
int i,N;
double k1=0.0,k2=0.0;
double xc=0.0,yc=0.0,x0=0.0,y0=0.0;
double *rain=new double[N];
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d %d %d %d\n%d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
if(y1<y2){t=y1;y1=y2;y2=t;t=x1;x1=x2;x2=t;}//固定使(x1,y1)在上面。
if(y3<y4){t=y3;y3=y4;y4=t;t=x3;x3=x4;x4=t;}//固定使(x3,y3)在上面。
if(y1==y2||y3==y4)rain[i]=0.0;//有块板水平则一定为0.00
else if(x1==x2&&x3==x4)rain[i]=0.0;//两块板同时竖直也一定为0.00
else if(x1==x2&&x3!=x4){//第一块板竖直的情况,因为没斜率故单独算
k2=(y3-y4+0.0)/(x3-x4+0.0);
x0=x1;
y0=k2*(x0-x3)+y3;
if(y3<=y1){
xc=x1;
yc=y3;
rain[i]=fabs((yc-y0)*(xc-x3)*0.5);
}
else {
yc=y1;
xc=(yc-y3)/k2+x3;
rain[i]=fabs((yc-y0)*(xc-x1)*0.5);
}
}
else if(x1!=x2&&x3==x4){//第二块板竖直的情况,因为没斜率故单独算
k1=(y1-y2+0.0)/(x1-x2+0.0);
x0=x3;
y0=k1*(x0-x1)+y1;
if(y3<=y1){
yc=y3;
xc=(yc-y1)/k1+x1;
rain[i]=fabs((yc-y0)*(x3-xc)*0.5);
}
else {
yc=y1;
xc=x3;
rain[i]=fabs((yc-y0)*(x1-xc)*0.5);
}
}
else if(x1!=x2&&x3!=x4){//两块板都不竖直的情况
k1=(y1-y2+0.0)/(x1-x2+0.0);
k2=(y3-y4+0.0)/(x3-x4+0.0);
if(fabs(k1-k2)<0.00001){//两块板平行
rain[i]=0.0;
}else{
x0=(y3-y1+k1*x1-k2*x3)/(k1-k2);
y0=k1*(x0-x1)+y1;
if(!(y2<=y0&&y0<=y1)||!(y4<=y0&&y0<=y3))
{//两块板虽然不平行,但不相交(因为是线段不是直线)
rain[i]=0.0;
} else{//通常情况
if(y3<=y1){
yc=y3;
xc=(yc-y1)/k1+x1;
rain[i]=fabs((yc-y0)*(x3-xc)*0.5);
}else {
yc=y1;
xc=(yc-y3)/k2+x3;
rain[i]=fabs((yc-y0)*(x1-xc)*0.5);
}
}
}
}
}
for(i=0;i<N;i++){printf("%.2lf\n",rain[i]);}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator