空のアルゴリズムとの戦い - シャオヤンの成長軌跡 (2)

序文

ここに画像の説明を挿入
「作者のホームページ」Sprite Youbai Bubbles
「個人サイト」スプライトの個人サイト
「おすすめコラム」

Java ワンストップサービス
フロントエンドのクールなコード共有
uniapp-構築からプロモーションまで
0 から英雄へ、Vue の神への道
アルゴリズムを解く、1 列で十分
0 からアーキテクチャを語ろう
データ循環の微妙な仕組み

画像の説明を追加してください

1 はじめに

主人公紹介

Xiao Yanは、中国の作家Tiancan Tudouの小説「Fights Break the Sphere」に登場する架空の人物です。小説の中で、若き天才錬金術師であり戦う気の使い手であるシャオヤンは、多くの困難と挑戦を経験し、たゆまぬ努力と知恵によって、ついに強力な存在となった。
ここに画像の説明を挿入

最短経路アルゴリズム

最短パス アルゴリズムはグラフ理論の重要な内容であり、グラフ内の 2 つの頂点間の最短パスを見つける問題を解決するために使用されます。アニメーションにはさまざまなリソース ポイントが存在する場合があり、機器や医薬品などを入手するには、これらのリソースを収集する必要があります。最短パス アルゴリズムを使用すると、現在の場所に最も近いリソース ポイントをすばやく見つけることができ、時間と労力を節約できます。

2.Dou Break Skyにおける最短経路アルゴリズムの適用

2.1 ダイクストラアルゴリズムの概要

ダイクストラのアルゴリズムは、重み付きグラフにおける単一ソースの最短経路問題を解くための古典的なアルゴリズムです。このアルゴリズムは、開始ノードと他のすべてのノードの間の最短パスを徐々に決定し、距離配列を使用して各ノードの最短距離を記録します。

アルゴリズムの基本的な考え方は、開始ノードから開始し、最初に開始ノードの最短距離を 0 に設定し、次に開始ノードに直接接続されているノードを段階的に考慮して、これらのノードの最短距離を更新することです。次に、配列内で距離が最小のマークのないノードを次に検討するノードとして選択し、それに接続されているノードの最短距離を更新します。すべてのノードがマークされるか、更新できるノードがなくなるまで、このプロセスを繰り返します。

ダイクストラ アルゴリズムは貪欲な戦略を採用しており、開始ノードに最も近いノードが更新用に選択されるたびに、各ノードの最短パスが徐々に決定されることが保証され、毎回更新されるノードは、これまでにわかっている最短距離を持つノードのセットの中で開始ノードに最も近いノードになります。

2.2 Dou Break Sphere の最短経路問題

Dou Break Sphere のようなゲームでは、最短パス アルゴリズムは次のようなさまざまな方法で適用できます。

  1. リソース収集: ゲームにはさまざまなリソース ポイントが存在する可能性があり、プレイヤーは機器や薬用材料などを入手するためにこれらのリソースを収集する必要があります。最短パス アルゴリズムを使用すると、プレーヤーは現在の場所に最も近いリソース ポイントをすばやく見つけることができ、時間とエネルギーを節約できます。

  2. モンスターの出現: Fights Break Sphere では、プレイヤーはアップグレードして報酬を得るためにさまざまなモンスターを倒す必要があります。最短経路アルゴリズムは、プレイヤーが現在位置に最も近いモンスターエリアを見つけるのに役立ち、効率と経験を向上させます。

  3. マップ探索: 仮想世界には通常、巨大なマップがあり、プレイヤーは最短経路アルゴリズムを使用して独自の探索ルートを計画し、新しい地域やコンテンツをより適切に発見できます。

2.3 アルゴリズムの実装と結果の分析

Fights Break Sphere のようなゲームでは、次の手順でダイクストラ アルゴリズムを実装できます。

  1. 最短距離を記録するための配列を作成します。初期値は無限 (未知を意味します) です。

  2. 開始ノードの最短距離を 0 に設定し、開始ノードを訪問ノードのセットに追加します。

  3. 開始ノードに直接接続されているノードをトラバースし、それらの最短距離を更新します。

  4. 距離配列から最小のマークされていないノードを選択し、それを次の考慮対象ノードとして使用し、それに接続されているノードの最短距離を更新します。

  5. すべてのノードがマークされるか、更新できるノードがなくなるまで、手順 4 を繰り返します。
    ここに画像の説明を挿入

トピック

Doubreaking Sphere での最短パスの計算 説明
: Doubreaking Sphere には、いくつかのノードとその接続、および対応する重みがマークされたマップがあります。指定した開始ノードから目的ノードまでの最短経路を計算し、その最短経路の長さを返すアルゴリズムを設計してください。

入力:

  • ゲーム マップを表す重み付けされた無向接続グラフ。
  • 開始ノードの番号。
  • ターゲットノードの番号。

出力:

  • 最短経路の長さ。

例:

输入: グラフ = { 'A': [('B', 2), ('C', 4)], 'B': [('A', 2), ('C', 1), ('D', 7)], 'C': [('A', 4), ('B', 1), ('D', 3)], 'D': [('B', 7), ('C', 3)] } スタートノード = 'A' ターゲットノード = ' D '



出力: 6

説明: ノード A からノード D への最短パスは A -> B -> C -> D で、パスの長さは 6 です。

答え

以下は、Dou Break Sphere の最短パスの長さを計算するダイクストラのアルゴリズムに基づいて C++ で書かれたソリューションです。

#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++で書かれたDou Break Skyの最短パスを計算する解法です。このコードは、特定の開始ノードから宛先ノードまでの最短パス長を計算するダイクストラのアルゴリズムを実装しています。まず、ゲームマップを表す無向接続グラフ(Graph)を構築し、ノード(Node)のデータ構造と接続関係を定義します。次に、プライオリティ キューを使用して次に近いノードを選択し、ハッシュ テーブルを使用して各ノードの最短パス長を記録します。計算プロセスでは、ターゲット ノードに到達するか、到達可能なすべてのノードを横断するまで、隣接ノードの最短パス長を継続的に更新する貪欲戦略が採用されます。最後に、最短経路の長さを出力します。

エピローグ

つまり、Xiao Yan の物語は現実ではありませんが、グラフ理論のアルゴリズムをより深く理解し、適用するために、彼の歴史をグラフ理論のアイデアと結び付けることができます。

おすすめ

転載: blog.csdn.net/Why_does_it_work/article/details/131928015