隐匿行踪(最短路)

本文介绍了一种解决特定场景下的最短路径问题的方法。通过将问题转化为图论中的节点和边,利用迪杰斯特拉算法求解狮子兽在战场环境中如何避免敌方侦查,寻找最优路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在数码世界的某次战争中,年轻的狮子兽收到了一封密函,密函中指出需要让他从当前坐标赶往另一个坐标去狙击敌人的精英部队。但是狮子兽知道,整个战场都有可能被敌方的飞行兽从上往下侦查到,因此需要注意隐匿自己的行踪。
狮子兽虽然年轻,但他对战场非常了解,他知道在战场上存在N个无法被飞行兽侦查到的浮空圆盘,只要在浮空圆盘内部(包括圆盘边界,下同)就不会被飞行兽侦查到(浮空圆盘可能重叠)。
现在狮子兽想要从当前坐标前往指定坐标(假设其行进速度恒定,1单位时间行进1单位距离),但是为了减少暴露自己的可能,所以想使不在浮空圆盘内部的时间尽可能少。
注意:整个战场是一个连续二维坐标平面,地势平缓,且狮子兽的行进可以是任何方向、可以是直线也可以是曲线。

Input

每个输入文件中一组数据。
第一行一个正整数N(1<=N<=1000),表示浮空圆盘的个数。
接下来N行,每行三个整数x, y, r(-1000<=x,y<=1000、0<=r<=10),分别代表浮空圆盘的坐标(x,y)和半径r。
最后分两行给出狮子兽的当前坐标和目的坐标,每行两个整数x, y(-1000<=x,y<=1000)。
输出格式
输出不在浮空圆盘内部的最少时间(即不得不暴露在飞行兽侦查下的最少时间)。结果精度保留两位小数。

Output

输出不在浮空圆盘内部的最少时间(即不得不暴露在飞行兽侦查下的最少时间)。结果精度保留两位小数。

Simple Input

1
0 0 1
2 0
0 2

Simple Output

2.00


思路:这就是一道披着狮子兽的最短路。把时间转换成两圆盘之间路径的权值,两圆盘路径的权值=两圆盘的圆心距离-两圆盘各自的半径,圆盘重叠权值就为0。起点和终点就相当于半径为0的圆盘。然后就是最短路了。

下面是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;


double matrix[1005][1005];
int n; 
int x[1005],y[1005],r[1005];
int k,mark[1005];
double minn,dist[1005];

void Dijkstra(int x)
{
    for(int i=1;i<=n;i++) {
        mark[i] = 0;
        dist[i] = matrix[x][i];
    }
    mark[x] = 1;
    do {
        minn=MOD;
        k=0;
        for(int i=1;i<=n;i++)
            if(mark[i]==0 && dist[i]<minn) {
                minn = dist[i];
                k = i;
            }
        if(k) {
            mark[k] = 1;
            for(int i=1;i<=n;i++)
                if(matrix[k][i]<MOD && minn+matrix[k][i]<dist[i]) {
                    dist[i] = minn + matrix[k][i];
                }
        }
    }while(k);
    printf("%.2lf\n",dist[n]);
}



int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&x[i],&y[i],&r[i]);
        }
        scanf("%d%d%d%d",&x[n+1],&y[n+1],&x[n+2],&y[n+2]);
        r[n+1]=r[n+2]=0;
        n+=2;
        for(int i=1;i<=n;i++)
        {
            matrix[i][i]=MOD;
            for(int j=1;j<i;j++)
            {
                //cout<<x[i]<<" "<<y[i]<<' '<<x[j]<<' '<<y[j]<<endl;
                //计算路径权值
                matrix[i][j]=matrix[j][i]=max(0.0,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))-r[i]-r[j]);
                //printf("%lf\n",matrix[i][j]);
            }
        }
        Dijkstra(n-1);
    }
}
<think>好的,用户想了解隐匿函数的概念和用法,特别是定义、使用场景和编程中的应用。首先,我需要确认“隐匿函数”是不是用户打错了,可能指的是“匿名函数”,也就是没有名字的函数。这在很多编程语言中确实存在,比如Python中的lambda函数。 用户提到的引用[1]和[2]都是关于Python的匿名函数,所以应该以这个为基础来回答。需要先给出匿名函数的定义,说明它通常使用lambda关键字创建,没有函数名,适用于简单的操作。然后,使用场景方面,可以提到在需要函数作为参数的地方,比如map、filter、reduce这些高阶函数里,或者排序时作为key函数。此外,匿名函数适合简化代码,避免定义不必要的正式函数。 在编程中的应用部分,需要举一些具体的例子,比如用lambda函数进行列表排序,或者在事件处理中的回调函数。同时,要注意指出匿名函数的局限性,比如只能包含单个表达式,不能有复杂的逻辑,这时候可能需要用def定义常规函数。 另外,引用[3]提到Rust的溢出检查,虽然和匿名函数无关,但可能用户对编程语言的特性感兴趣,不过这里可以忽略,专注在匿名函数上。需要确保回答结构清晰,分点说明定义、使用场景和编程实例,后加上相关问题引导用户进一步思考。还要检查是否符合格式要求,数学公式用$...$,独立公式用$$...$$,不过这次问题可能不涉及数学公式,所以可能不需要。后生成的相关问题要围绕匿名函数的扩展内容,比如优缺点、替代方案、在特定语言中的实现等。</think>### 隐匿函数(匿名函数)详解 #### 1. **定义** 隐匿函数(匿名函数)是一种无需显式定义函数名称的临时函数,通常用于简化代码或作为参数传递给高阶函数。在Python中,匿名函数通过`lambda`关键字定义,语法为: $$ \text{lambda <参数列表>: <表达式>} $$ 例如:`lambda x: x**2`定义了一个输入$x$返回其平方的函数[^1][^2]。 #### 2. **使用场景** - **函数式编程**:与`map()`, `filter()`, `reduce()`等函数配合使用。例如: ```python list(map(lambda x: x*2, [1,2,3])) # 输出 [2,4,6] ``` - **简化代码**:替代简单的一次性函数定义,如排序键函数: ```python sorted([(1,'b'), (2,'a')], key=lambda x: x[1]) # 按元组第二个元素排序 ``` - **闭包和回调**:在事件驱动编程中作为临时回调函数[^2]。 #### 3. **编程中的具体应用** **示例1:条件过滤** ```python data = [1, 5, 3, 8] filtered = list(filter(lambda x: x > 4, data)) # 输出 [5,8] ``` **示例2:动态函数生成** ```python def make_multiplier(n): return lambda x: x * n double = make_multiplier(2) print(double(5)) # 输出 10 ``` **局限性**: - 匿名函数只能包含单个表达式,无法处理复杂逻辑(如多分支、循环)。 - 可读性可能降低,需根据场景权衡使用[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值