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 |
平面三角函数的方法解这道题很方便,附AC代码#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <cstring> #include <cstdlib> using namespace std; double x,y,z,a,b,c,d; struct point { double x,y,z; }; point poly[4]; double eps=1e-7,ans,pi=acos(-1.000); bool inter(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) { double a1,b1,c1,a2,b2,c2,z1,z2,z3,z4; z1=(d-a*x1-b*y1)/c; z2=(d-a*x2-b*y2)/c; z3=(d-a*x3-b*y3)/c; z4=(d-a*x4-b*y4)/c; a1=y2-y1; b1=x1-x2; c1=y1*x2-y2*x1; a2=y4-y3; b2=x3-x4; c2=y3*x4-y4*x3; if(a1*b2==a2*b1) return false; x=(c2*b1-c1*b2)/(a1*b2-a2*b1); y=(c2*a1-c1*a2)/(b1*a2-b2*a1); z=(d-a*x-b*y)/c; if(!((x<x1+eps&&x>x2-eps)||(x<x2+eps&&x>x1-eps))) return false; if(!((y<y1+eps&&y>y2-eps)||(y<y2+eps&&y>y1-eps))) return false; if(!((z<z1+eps&&z>z2-eps)||(z<z2+eps&&z>z1-eps))) return false; if(!((x<x3+eps&&x>x4-eps)||(x<x4+eps&&x>x3-eps))) return false; if(!((y<y3+eps&&y>y4-eps)||(y<y4+eps&&y>y3-eps))) return false; if(!((z<z3+eps&&z>z4-eps)||(z<z4+eps&&z>z3-eps))) return false; return true; } double dist(double x1,double y1,double z1,double x2,double y2,double z2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); } double fermat(double x1,double y1,double z1,double x2,double y2,double z2,double x3,double y3,double z3) { double arg,res=1000000000,a,b,c,A,B,C; a=dist(x1,y1,z1,x2,y2,z2); b=dist(x2,y2,z2,x3,y3,z3); c=dist(x1,y1,z1,x3,y3,z3); A=(b*b+c*c-a*a)/(2*b*c); A=acos(A); B=(a*a+c*c-b*b)/(2*a*c); B=acos(B); C=(a*a+b*b-c*c)/(2*a*b); C=acos(C); res=min(res,a+b); res=min(res,a+c); res=min(res,b+c); if(A>pi*2.00/3.00||B>pi*2.00/3.00||C>pi*2.00/3.00) return res; arg=(sin(B)*sin(A)-sin(A)*sin(B-pi/3.00))/(sin(A)*cos(B-pi/3.00)+sin(B)*cos(A)); arg=atan(arg); if(arg<0) arg+=pi; if(arg>pi/3.00||arg>A) return res; res=min(res,2*sqrt(3.000)*(c*(sin(pi/3.000-arg)+sin(arg))+b*sin(A-arg))/3.0); return res; } double cal(point aa,point bb,point cc,point dd) { double arg,a,b,c,d,A,B,C,D,dig1,dig2,res=1000000000; a=dist(aa.x,aa.y,aa.z,dd.x,dd.y,dd.z); b=dist(dd.x,dd.y,dd.z,cc.x,cc.y,cc.z); c=dist(cc.x,cc.y,cc.z,bb.x,bb.y,bb.z); d=dist(bb.x,bb.y,bb.z,aa.x,aa.y,aa.z); dig1=dist(bb.x,bb.y,bb.z,dd.x,dd.y,dd.z); A=(a*a+d*d-dig1*dig1)/(2*a*d); A=acos(A); C=(b*b+c*c-dig1*dig1)/(2*b*c); C=acos(C); dig2=dist(aa.x,aa.y,aa.z,cc.x,cc.y,cc.z); B=(d*d+c*c-dig2*dig2)/(2*c*d); B=acos(B); D=(a*a+b*b-dig2*dig2)/(2*a*b); D=acos(D); arg=(d*sin(2.00*pi/3.00-A)-a*sqrt(3.000)/2.00-b*sin(D))/(b*cos(D)-a-d*cos(2.00*pi/3.00-A)-a/2.00); arg=atan(arg); if(arg<0) arg+=pi; if(arg>pi/3.00||arg>A||B+A-arg-pi*2/3.000<0||C+D+arg-pi<0) return res; return 2*sqrt(3.000)*(a*sin(arg)+d*sin(pi/3.00+A-arg)+c*(sin(C+D+arg-pi)+sin(B+A-arg-2.00*pi/3.00)))/3.000; } int main() { int n,id1,id2,id3,i,j,s,p,q,t,id[3],tst=0; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); scanf("%d",&t); while(t--) { tst++; scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf%lf",&poly[i].x,&poly[i].y,&poly[i].z); ans=1000000000; if(n==4) { if(inter(poly[0].x,poly[0].y,poly[1].x,poly[1].y,poly[2].x,poly[2].y,poly[3].x,poly[3].y)) { if(ans>dist(poly[0].x,poly[0].y,poly[0].z,poly[1].x,poly[1].y,poly[1].z)+dist(poly[2].x,poly[2].y,poly[2].z,poly[3].x,poly[3].y,poly[3].z)) ans=dist(poly[0].x,poly[0].y,poly[0].z,poly[1].x,poly[1].y,poly[1].z)+dist(poly[2].x,poly[2].y,poly[2].z,poly[3].x,poly[3].y,poly[3].z); if(ans>min(cal(poly[0],poly[2],poly[1],poly[3]),cal(poly[0],poly[3],poly[1],poly[2]))) ans=min(cal(poly[0],poly[2],poly[1],poly[3]),cal(poly[0],poly[3],poly[1],poly[2])); } if(inter(poly[0].x,poly[0].y,poly[2].x,poly[2].y,poly[1].x,poly[1].y,poly[3].x,poly[3].y)) { if(ans>dist(poly[0].x,poly[0].y,poly[0].z,poly[2].x,poly[2].y,poly[2].z)+dist(poly[1].x,poly[1].y,poly[1].z,poly[3].x,poly[3].y,poly[3].z)) ans=dist(poly[0].x,poly[0].y,poly[0].z,poly[2].x,poly[2].y,poly[2].z)+dist(poly[1].x,poly[1].y,poly[1].z,poly[3].x,poly[3].y,poly[3].z); if(ans>min(cal(poly[0],poly[1],poly[2],poly[3]),cal(poly[0],poly[3],poly[2],poly[1]))) ans=min(cal(poly[0],poly[1],poly[2],poly[3]),cal(poly[0],poly[3],poly[2],poly[1])); } if(inter(poly[0].x,poly[0].y,poly[3].x,poly[3].y,poly[1].x,poly[1].y,poly[2].x,poly[2].y)) { if(ans>dist(poly[0].x,poly[0].y,poly[0].z,poly[3].x,poly[3].y,poly[3].z)+dist(poly[1].x,poly[1].y,poly[1].z,poly[2].x,poly[2].y,poly[2].z)) ans=dist(poly[0].x,poly[0].y,poly[0].z,poly[3].x,poly[3].y,poly[3].z)+dist(poly[1].x,poly[1].y,poly[1].z,poly[2].x,poly[2].y,poly[2].z); if(ans>min(cal(poly[0],poly[1],poly[3],poly[2]),cal(poly[0],poly[2],poly[3],poly[1]))) ans=min(cal(poly[0],poly[1],poly[3],poly[2]),cal(poly[0],poly[2],poly[3],poly[1])); } for(i=0;i<4;i++) { if(i==0) { id[0]=1; id[1]=2; id[2]=3; } else if(i==1) { id[0]=0; id[1]=2; id[2]=3; } else if(i==2) { id[0]=0; id[1]=1; id[2]=3; } else { id[0]=0; id[1]=1; id[2]=2; } if(ans>dist(poly[i].x,poly[i].y,poly[i].z,poly[id[0]].x,poly[id[0]].y,poly[id[0]].z)+dist(poly[i].x,poly[i].y,poly[i].z,poly[id[1]].x,poly[id[1]].y,poly[id[1]].z)+dist(poly[i].x,poly[i].y,poly[i].z,poly[id[2]].x,poly[id[2]].y,poly[id[2]].z)) ans=dist(poly[i].x,poly[i].y,poly[i].z,poly[id[0]].x,poly[id[0]].y,poly[id[0]].z)+dist(poly[i].x,poly[i].y,poly[i].z,poly[id[1]].x,poly[id[1]].y,poly[id[1]].z)+dist(poly[i].x,poly[i].y,poly[i].z,poly[id[2]].x,poly[id[2]].y,poly[id[2]].z); double temp=1000000000; for(j=0;j<3;j++) { if(temp>dist(poly[i].x,poly[i].y,poly[i].z,poly[id[j]].x,poly[id[j]].y,poly[id[j]].z)) temp=dist(poly[i].x,poly[i].y,poly[i].z,poly[id[j]].x,poly[id[j]].y,poly[id[j]].z); } if(ans>temp+fermat(poly[id[0]].x,poly[id[0]].y,poly[id[0]].z,poly[id[1]].x,poly[id[1]].y,poly[id[1]].z,poly[id[2]].x,poly[id[2]].y,poly[id[2]].z)) ans=temp+fermat(poly[id[0]].x,poly[id[0]].y,poly[id[0]].z,poly[id[1]].x,poly[id[1]].y,poly[id[1]].z,poly[id[2]].x,poly[id[2]].y,poly[id[2]].z); } } else ans=fermat(poly[0].x,poly[0].y,poly[0].z,poly[1].x,poly[1].y,poly[1].z,poly[2].x,poly[2].y,poly[2].z); printf("Province # %d : %.2lf\n",tst,ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator