斗破苍穹算法——萧炎的成长之路(二)

前言

在这里插入图片描述
「作者主页」雪碧有白泡泡
「个人网站」雪碧的个人网站
「推荐专栏」

java一站式服务
前端炫酷代码分享
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
数据流通的精妙之道

请添加图片描述

1. 引言

主角介绍

萧炎是一位虚构角色,出自于中国作家天蚕土豆的小说《斗破苍穹》。在小说中,萧炎是一个年轻的天才炼药师和斗气修炼者,他经历了许多困难和挑战,通过不断努力和智慧,最终成为了强大的存在。
在这里插入图片描述

最短路径算法

最短路径算法是图论中的一个重要内容,用于解决在图中找到两个顶点之间最短路径的问题。动画中可能存在各种资源点,需要采集这些资源来获得装备、药材等。使用最短路径算法,可以帮助快速找到距离当前位置最近的资源点,节省时间和精力。

2. 最短路径算法在斗破苍穹的应用

2.1 迪杰斯特拉算法简介

迪杰斯特拉算法是一种用于解决带权重图中单源最短路径问题的经典算法。该算法通过逐步确定起始节点到其他所有节点之间的最短路径,并使用一个距离数组来记录每个节点的最短距离。

算法的基本思想是从起始节点开始,首先将起始节点的最短距离设为0,然后以递增的方式依次考虑与起始节点直接相连的节点,更新这些节点的最短距离。随后,选择一个距离数组中最小且未被标记过的节点作为下一个考虑的节点,并更新与它相连的节点的最短距离。重复这个过程,直到所有节点都被标记过或者没有可以更新的节点为止。

迪杰斯特拉算法采用贪心策略,每次选择离起始节点最近的节点进行更新,保证了每个节点的最短路径会被逐步确定,并且每次更新的节点都是目前已知最短距离的节点集合中距离起始节点最近的节点。

2.2 斗破苍穹中的最短路径问题

在斗破苍穹这样的游戏中,最短路径算法可以应用于多个方面,比如:

  1. 资源采集:游戏中可能存在各种资源点,玩家需要采集这些资源来获得装备、药材等。使用最短路径算法,可以帮助玩家快速找到距离当前位置最近的资源点,节省时间和精力。

  2. 怪物刷怪:在斗破苍穹中,玩家需要击败各种怪物进行升级和获取奖励。最短路径算法可以帮助玩家找到离自己当前位置最近的怪物区域,提高效率和体验。

  3. 地图探索:虚拟世界中通常有庞大的地图,玩家可以利用最短路径算法规划自己的探索路线,以便更好地发现新的地域和内容。

2.3 算法实现与结果分析

在斗破苍穹这样的游戏中,实现迪杰斯特拉算法可以通过以下步骤:

  1. 创建一个用于记录最短距离的数组,初始值为无穷大(表示未知)。

  2. 将起始节点的最短距离设为0,并将起始节点加入已访问节点集合。

  3. 遍历与起始节点直接相连的节点,并更新它们的最短距离。

  4. 从距离数组中选择最小且未被标记过的节点,将其作为下一个考虑的节点,并更新与它相连的节点的最短距离。

  5. 重复步骤4,直到所有节点都被标记过或者没有可以更新的节点为止。
    在这里插入图片描述

题目

斗破苍穹中的最短路径计算
描述: 在斗破苍穹中,有一张地图,地图上标记了一些节点和它们之间的连接关系以及对应的权重。请你设计一个算法,计算出指定起始节点到目标节点的最短路径,并返回该最短路径的长度。

输入:

  • 一个带权重的无向连通图,表示游戏地图。
  • 起始节点的编号。
  • 目标节点的编号。

输出:

  • 最短路径的长度。

示例:

输入: graph = {
‘A’: [(‘B’, 2), (‘C’, 4)],
‘B’: [(‘A’, 2), (‘C’, 1), (‘D’, 7)],
‘C’: [(‘A’, 4), (‘B’, 1), (‘D’, 3)],
‘D’: [(‘B’, 7), (‘C’, 3)] } start_node = ‘A’ target_node = ‘D’

输出: 6

解释: 从节点 A 到节点 D 的最短路径是 A -> B -> C -> D,路径长度为 6。

题解

以下是使用C++编写的解决方案,基于Dijkstra算法来计算斗破苍穹中最短路径的长度。

#include <iostream>
#include <unordered_map>
#include <queue>
#include <limits>

// 定义图中节点的类型
typedef char Node;

// 定义连接关系和权重的数据结构
struct Edge {
    
    
    Node node;
    int weight;
};

// 定义无向连通图的类型
typedef std::unordered_map<Node, std::vector<Edge>> Graph;

// 定义最短路径的长度的数据结构
typedef std::unordered_map<Node, int> ShortestPathLengths;

// 计算最短路径的长度
int calculateShortestPathLength(const Graph& graph, const Node& startNode, const Node& targetNode) {
    
    
    // 创建一个优先队列来选择下一个最近节点
    std::priority_queue<std::pair<int, Node>, std::vector<std::pair<int, Node>>, std::greater<std::pair<int, Node>>> pq;

    // 创建一个用于存储最短路径长度的哈希表,并初始化为无穷大
    ShortestPathLengths shortestPaths;
    for (const auto& pair : graph) {
    
    
        shortestPaths[pair.first] = std::numeric_limits<int>::max();
    }

    // 设置起始节点的最短路径长度为0,并将其加入到优先队列中
    shortestPaths[startNode] = 0;
    pq.push(std::make_pair(0, startNode));

    while (!pq.empty()) {
    
    
        // 取出当前最近节点
        Node currentNode = pq.top().second;
        int currentDistance = pq.top().first;
        pq.pop();

        // 如果当前节点已经被访问过,则跳过
        if (currentDistance > shortestPaths[currentNode]) {
    
    
            continue;
        }

        // 遍历当前节点的邻居节点
        for (const Edge& edge : graph.at(currentNode)) {
    
    
            Node neighborNode = edge.node;
            int weight = edge.weight;

            // 计算从起始节点到邻居节点的新路径长度
            int newDistance = currentDistance + weight;

            // 如果新路径长度比当前记录的最短路径长度小,则更新最短路径长度,并将邻居节点加入到优先队列中
            if (newDistance < shortestPaths[neighborNode]) {
    
    
                shortestPaths[neighborNode] = newDistance;
                pq.push(std::make_pair(newDistance, neighborNode));
            }
        }
    }

    // 返回目标节点的最短路径长度
    return shortestPaths[targetNode];
}

int main() {
    
    
    // 构建示例中的图
    Graph graph = {
    
    
        {
    
    'A', {
    
    {
    
    'B', 2}, {
    
    'C', 4}}},
        {
    
    'B', {
    
    {
    
    'A', 2}, {
    
    'C', 1}, {
    
    'D', 7}}},
        {
    
    'C', {
    
    {
    
    'A', 4}, {
    
    'B', 1}, {
    
    'D', 3}}},
        {
    
    'D', {
    
    {
    
    'B', 7}, {
    
    'C', 3}}}
    };

    // 指定起始节点和目标节点
    Node startNode = 'A';
    Node targetNode = 'D';

    // 计算最短路径的长度
    int shortestPathLength = calculateShortestPathLength(graph, startNode, targetNode);

    // 输出结果
    std::cout << "最短路径的长度: " << shortestPathLength << std::endl;

    return 0;
}

以上是使用C++编写的斗破苍穹最短路径计算的解决方案。该代码实现了Dijkstra算法来计算给定起始节点到目标节点的最短路径长度。首先,通过构建一个无向连通图(Graph)来表示游戏地图,并定义了节点(Node)和连接关系的数据结构。然后,使用优先队列来选择下一个最近的节点,并使用哈希表来记录每个节点的最短路径长度。在计算过程中,采用贪心策略,不断更新邻居节点的最短路径长度,直到到达目标节点或遍历完所有可达的节点。最后,输出最短路径的长度。

结语

总之,虽然萧炎的故事并非真实存在,但我们可以将他的历与图论的思想相联系,以更好地理解和应用图论算法。

猜你喜欢

转载自blog.csdn.net/Why_does_it_work/article/details/131928015