最短路
最短路
https://ac.nowcoder.com/acm/contest/5158/A
题目描述
牛能在家里遇到了一个问题,他现在想要去找牛可乐并向他请教这个问题,现在他已经知道了牛可乐家的坐标,并且他很容易找到了通往牛可乐家里的最短路(一条直线)。
但是,平面上有一个圆形区域,这个圆形区域内是被诅咒过的地方,所以牛能不能进入这块圆形区域的内部,所以牛能现在找不到通往牛可乐家的最短路了,请帮助他解决这个问题!
保证牛能家和牛可乐家不在诅咒区域内。
输入描述:
第一行四个整数 x1,y1,x2,y2x1, y1, x2, y2x1,y1,x2,y2,(x1,y1)(x1, y1)(x1,y1) 表示牛能家的坐标,(x2,y2)(x2, y2)(x2,y2) 表示牛可乐家的坐标。
第二行三个整数 x3,y3,rx3, y3, rx3,y3,r,(x3,y3)(x3, y3)(x3,y3) 表示被诅咒的圆形区域的位置的圆心坐标,rrr 表示这个圆形区域的半径。
输出描述:
在一行中输出牛能从家到牛可乐家的最短路。
示例1
输入
-1 -1 1 1
0 0 1
输出
3.570796
示例2
输入
1 1 2 2
0 0 1
输出
1.414214
备注:
−1e5<=x1,y1,x2,y2,x3,y3<=1e5
1<=r<=1e5
如果标准答案是a,你的答案是b,当满足≤10^−6你的答案被认为是正确的。
代码:
#include #include using namespace std; const double pi=3.1415926535898; int main(){ double x1,x2,y1,y2,x3,y3,R; cin>>x1>>y1>>x2>>y2>>x3>>y3>>R; double d13=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); double d12=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); double d23=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); double cos0=(d12*d12+d13*d13-d23*d23)/(2*d12*d13); double cos02=(d12*d12+d23*d23-d13*d13)/(2*d12*d23); double cos03=(d13*d13+d23*d23-d12*d12)/(2*d13*d23); double sin0=sqrt(1-cos0*cos0); if(cos0*cos02R){ printf("%.6lf\n",d12); return 0; } double zhixian=sqrt(d13*d13-R*R)+sqrt(d23*d23-R*R); double jiaodu=acos(cos03)-acos(R/d13)-acos(R/d23); double huchang=R*jiaodu; double total=huchang+zhixian; printf("%.6lf\n",total); }