Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

恳请各位给看看啊,我已经通过各种测试就是不能通过,求各位指点一下!!!!

Posted by ddna at 2006-05-15 15:09:12
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator