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> 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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator