列表

详情


NC204857. 最短路

描述

牛能在家里遇到了一个问题,他现在想要去找牛可乐并向他请教这个问题,现在他已经知道了牛可乐家的坐标,并且他很容易找到了通往牛可乐家里的最短路(一条直线)。
但是,平面上有一个圆形区域,这个圆形区域内是被诅咒过的地方,所以牛能不能进入这块圆形区域的内部,所以牛能现在找不到通往牛可乐家的最短路了,请帮助他解决这个问题!

保证牛能家和牛可乐家不在诅咒区域内。

输入描述

第一行四个整数  表示牛能家的坐标, 表示牛可乐家的坐标。

第二行三个整数  表示被诅咒的圆形区域的位置的圆心坐标, 表示这个圆形区域的半径。

输出描述

在一行中输出牛能从家到牛可乐家的最短路。

示例1

输入:

-1 -1 1 1
0 0 1

输出:

3.570796

示例2

输入:

1 1 2 2
0 0 1

输出:

1.414214

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2020-06-16 19:58:40

#include<stdio.h>
#include<math.h>
using namespace std;
struct p
{
    double x,y;
} a,b,c;
double dis(p a,p b)
{
    return hypot(a.x-b.x,a.y-b.y);
}
int main()
{
    double r;
    scanf("%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&r);
    double d1=dis(a,b),d2=dis(a,c),d3=dis(b,c);
    double g1=acos((d2*d2+d3*d3-d1*d1)/(2*d2*d3)),g2=acos(r/d2),g3=acos(r/d3);
    if(g2+g3>g1)
        printf("%.6lf\n",d1);
    else
        printf("%.6lf\n",sqrt(d2*d2-r*r)+sqrt(d3*d3-r*r)+(g1-g2-g3)*r);
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 608K, 提交时间: 2020-04-23 08:57:36

#include<bits/stdc++.h>
using namespace std;
struct p{
	double x,y;
}a,b,c;
double dis(p a,p b){
	return hypot(a.x-b.x,a.y-b.y);
}
int main(){
	double r;
	scanf("%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&r);
	double d1=dis(a,b),d2=dis(a,c),d3=dis(b,c);
	double g1=acos((d2*d2+d3*d3-d1*d1)/(2*d2*d3)),g2=acos(r/d2),g3=acos(r/d3);
	if(g2+g3>g1) printf("%.6lf\n",d1);
	else printf("%.6lf\n",sqrt(d2*d2-r*r)+sqrt(d3*d3-r*r)+(g1-g2-g3)*r);
	return 0;
} 

上一题