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 1030202872 at 2010-09-15 21:28:12 on Problem 1039
思路:
枚举任意一个上顶点和一个下顶点,求其合法性,即此线段形成的直线能从光源发出,再对此线段右边顶点的右边管道进行枚举,若有交点,则求出交点。
#include <stdio.h>
#include <math.h>
typedef struct
{
 double x,y;
}Node;
Node array[30];
int num;
double max,min;
void initial();
int law(int i,int j);
void deal();
double cal(int i,int j,int m);
void initial()
{
 int i;
 max=-10000;
 for(i=0;i<num;i++)
 {
  scanf("%lf%lf",&array[i].x,&array[i].y);
 }
}
int law(int i,int j)
{
 int k,m,judge=1;
 double temp,x0,x1,y0,y1;
 x0=array[i].x;
 y0=array[i].y-1;
 x1=array[j].x;
 y1=array[j].y;
 k=(i>=j)?i:j;
 for(m=0;m<k;m++)
 {
  if(m!=j&&m!=i)
  {
   temp=(y1-y0)*(array[m].x-x0)/(x1-x0)+y0;
   if(temp>array[m].y||temp<(array[m].y-1))
   {
    judge=0;
    break;
   }
  }
 }
 return judge;
}//判断由经过第i个下顶点和第j个上顶点的直线的合法性,若合法则返1。
void deal()
{
 int i,j,k,m,n;
 double temp,x0,x1,y0,y1,result;
 for(i=0;i<num;i++)
	 for(j=0;j<num;j++)
	 {
       min=-10000;
       if(i!=j&&law(i,j))
	   {
         k=(i>j)?i:j;
		 x0=array[i].x;
		 y0=array[i].y-1;
		 x1=array[j].x;
		 y1=array[j].y;
		 for(m=k+1;m<num;m++)
		 if(fabs(x1-x0)>1e-6)
		 {
          temp=y0+(y1-y0)*(array[m].x-x0)/(x1-x0);
		  if(temp>array[m].y||temp<array[m].y-1)
		  {
			result=cal(i,j,m);
            if(result>min)
				min=result;
				break;
		  }
		 }
		if(min>max) max=min;
	  }
	 }
	 if(fabs(x1-x0)>1e-10)
     temp=y0+(y1-y0)*(array[num-1].x-x0)/(x1-x0);
	 if(!(temp<array[num-1].y-1||temp>array[num-1].y))
     max=10000;
	 if(fabs(max-10000)<1e-13) printf("Through all the pipe.\n");
  else
	  printf("%.2f\n",max);
}//对经过第i个下顶点和第j个上顶点的合法直线,若其与线段右边的管道有交点,则求出,否则输出Through all the pipe.(这段话是后来加上的)
double cal(int i,int j,int m)
{
 double result,temp,x0,x1,y0,y1,x2,y2,x3,y3;
 x0=array[i].x;
 y0=array[i].y-1;
 x1=array[j].x;
 y1=array[j].y;
 if(fabs(x1-x0)>1e-10)
 temp=(y1-y0)*(array[m].x-x0)/(x1-x0)+y0;
 if(temp>array[m].y)
 {
  x2=array[m-1].x;
  y2=array[m-1].y;
  x3=array[m].x;
  y3=array[m].y;
 }
 else
	 if(temp<array[m].y-1)
	 {
      x2=array[m-1].x;
      y2=array[m-1].y-1;
      x3=array[m].x;
      y3=array[m].y-1;
	 }
	 if(fabs(x3-x2)>1e-13&&fabs(x1-x0)>1e-13&&fabs((y3-y2)/(x3-x2)-(y1-y0)/(x1-x0))>1e-13)
	result=((y3-y2)*x2/(x3-x2)+y0-y2-(y1-y0)*x0/(x1-x0))/((y3-y2)/(x3-x2)-(y1-y0)/(x1-x0));
	return result;
}//若直线有交点,则求出此交点
int main()
{
 scanf("%d",&num);
 while(num)
 {
  initial();
  deal();
  scanf("%d",&num);
 }
 return 0;
}

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