最短路

最短路

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);
}
全部评论
请问第15行的特判时什么意思啊?
点赞
送花
回复 分享
发布于 2020-04-19 16:07

相关推荐

5 收藏 评论
分享
牛客网
牛客企业服务