【题目】
Angel's Journey
【题解】
题意:给定圆心rx,ry和半径r和终点位置x,y,Miyako位于圆的底部即(rx,ry-r),直线y=ry以下和圆外的部分是海,不能直接通过。输出Miyako从起点到终点的最短距离。
思路:画图,分类讨论即可。
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const double pi=acos(-1.0); double rx,ry,r,x,y; double s; double len1(double a,double b,double c,double d) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)); } double len2(double a,double b,double c,double d,double rr) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)-rr*rr); } int main() { int t; scanf("%d",&t); while(t--){ scanf("%lf%lf%lf%lf%lf",&rx,&ry,&r,&x,&y); s=0; if(x<=rx-r) s=pi*r/2+len1(x,y,rx-r,ry); else if(x>=rx+r) s=pi*r/2+len1(x,y,rx+r,ry); else{ double d1,d2,d3,sina,sinb,a,b; d1=len1(x,y,rx,ry); d2=len2(x,y,rx,ry,r); d3=len1(x,y,x,ry); sina=d2/d1; sinb=d3/d1; s=d2+(asin(sinb)-asin(sina))*r+pi*r/2; } printf("%.4f\n",s); } return 0; }