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 |
各位大虾帮忙看看为何WA,例程已经通过.(附思路)思路:首先把问题转化为一个点(一个light),则变为从一个点射出的直线通过Pipe的问题. #include <stdio.h> #include <math.h> struct coordinate { double x,y; }; double cross(coordinate p1,coordinate p2,coordinate p3) { coordinate vector1,vector2; vector1.x=p2.x-p1.x; vector1.y=p2.y-p1.y; vector2.x=p3.x-p1.x; vector2.y=p3.y-p1.y; return vector1.x*vector2.y-vector1.y*vector2.x; } coordinate intersect(coordinate a1,coordinate a2,coordinate b1,coordinate b2) { double s1=fabs(cross(a1,a2,b1)),s2=fabs(cross(a1,a2,b2)),s; coordinate point; s=s1+s2; point.x=(s1*b2.x+s2*b1.x)/s; point.y=(s1*b2.y+s2*b1.y)/s; return point; } int main() { int i,n; coordinate light,temp; coordinate up0,down0; coordinate up,down,up_old,down_old,up_now,down_now; double max_x,temp1,temp2; scanf("%d",&n); while (n!=0) { scanf("%lf%lf",&up0.x,&up0.y); scanf("%lf%lf",&up.x,&up.y); down0.x=up0.x;down0.y=up0.y-1; down.x=up.x;down.y=up.y-1; up_old=up;down_old=down; light.x=(up0.x+up.x)/2; light.y=(up0.y+down.y)/2; for (i=2;i<n;i++) { scanf("%lf%lf",&up_now.x,&up_now.y); down_now.x=up_now.x;down_now.y=up_now.y-1; temp1=cross(light,down,down_now); if (temp1>=0) { temp2=cross(light,up,down_now); if (temp2<=0) down=down_now; else { temp=intersect(light,up,down_old,down_now); max_x=temp.x; break; } } temp1=cross(light,up,up_now); if (temp1<=0) { temp2=cross(light,down,up_now); if (temp2>=0) up=up_now; else { temp=intersect(light,down,up_old,up_now); max_x=temp.x; break; } } up_old=up_now;down_old=down_now; } if(i==n) printf("Through all the pipe.\n"); else printf("%.2lf\n",max_x); scanf("%d",&n); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator