| ||||||||||
| 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 | |||||||||
恳请各位给看看啊,我已经通过各种测试就是不能通过,求各位指点一下!!!!#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;//(x0,y0)是两板的交点,(xc,yc)是得到的能盛水的那个三角形的另一点
double *rain=new double[N];//rain是用来集中装结果的,结果是集中输出的
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)在(x2,y2)上面
if(y3<y4){t=y3;y3=y4;y4=t;t=x3;x3=x4;x4=t;}//固定让(x3,y3)在(x4,y4)上面
if(y1==y2||y3==y4)rain[i]=0.0;//两板都竖直
if(x1==x2&&x3==x4)rain[i]=0.0;//有一板水平
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);
}
}
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 if((k2<0.0&&k1<0.0&&k2<k1)&&(x3>=x1)){//一般把两板挡在下面了,共四种
rain[i]=0.0;
}else if((k1<0.0&&k2<0.0&&k1<k2)&&(x3<=x1)){
rain[i]=0.0;
}else if((k2>k1&&k2>0.0&&k1>0.0)&&(x3>=x1)){
rain[i]=0.0;
}else if((k1>k2&&k1>0.0&&k2>0.0)&&(x3<=x1)){
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("%.2f\n",rain[i]);}
return 0;
}
能通过的测试如下:(除了题目给的之外,其他的每一个都代表了一种特殊情况,为了省页面容易让各位看,我把每个特例写成一行)
0 1 1 0 1 0 2 1
0 1 2 1 1 0 1 2//这两个是题目
0 0 1 2 1 2 2 0//倒三角形 0.00
0 0 2 2 1 1 2 0
0 0 1 1 0 2 2 0//这两个是一块板把另一块挡住了,但方向不同 0.00
0 2 1 0 1 0 2 2//能盛水 2.00
0 0 2 0 0 2 2 2//两板水平 0.00
0 0 0 2 2 0 2 2//两板竖直 0.00
0 1 2 1 0 0 2 2//有一板水平 0.00
1 0 1 2 0 0 2 2//有一板竖直,但可以盛水 0.50
0 3 1 2 2 2 3 3//两板不相交 0.00
0 1 1 2 1 0 2 1//两板平行 0.00
恳请各位能给个指点!小弟谢谢了!为什么就是wr呢,还有什么特殊情况吗?
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator