A*路径规划算法 C++实现教程

A*学习资料:https://theory.stanford.edu/~amitp/GameProgramming/AStarComparison.html?spm=a2c4e.10696291.0.0.739719a4ruVBN8
在这里插入图片描述

在本篇博客中,我们将详细介绍如何使用 C++实现 A路径规划算法。A算法是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。它常用于游戏中的路径寻找、机器人导航等领域。

一、准备工作

我们需要包含以下头文件:

#include <iostream>
#include<windows.h>
#include<vector>
#include<cmath>

并使用 using namespace std; 来简化代码。

二、算法核心数据结构

  1. MyPoint:用于表示点的坐标以及相关的 ghf 值,其中 g 表示从起点到当前点的实际代价,h 表示从当前点到终点的估计代价,f = g + h 是综合代价。
  2. Direct:方向枚举,定义了八个方向。
  3. PathNode:辅助地图节点,包含地图的值、是否是最短路径中的一点以及是否走过的信息。
  4. MyTreeNode:树的节点类型,包含点的位置、父节点以及子节点的向量。

三、Astar 类的实现

  1. 初始化(Init)
    • 接收地图、地图高度、宽度、起始点和终点等信息。
    • 建立辅助地图 pathMap,并初始化其中每个节点的状态。
    • 创建开放列表的起始节点 beginTreeNode,并标记起点为已走过。
  2. 寻找路径(FindPath)
    • 不断循环,找出当前节点周围的 8 个可行点,并将它们保存到开放列表中。
    • 检查每个可行点是否在开放列表中,如果已经存在且当前点的 g 值更小,则更新开放列表中对应点的 g 值、f 值和父节点。
    • 如果可行点不在开放列表中,则计算其 h 值和 f 值,将其加入树中、开放列表和当前节点的子节点组。
    • 找出开放列表中 f 值最小的可行点,若该点为终点,则停止循环。
    • 标记走过的点,并从开放列表中删除最小 f 值可行点。
    • 路径回溯,将最终路径存储在 retPath 中。
  3. 打印路径(PrintRoute)
    • 打印路径上的点坐标,并计算路径总长度。
  4. 打印路径地图(PrintRouteMap)
    • 根据 pathMap 打印路线地图,标记出最短路径中的点。

在这里插入图片描述

四、算法具体实现步骤

  1. Init 函数中:
    • 为地图相关的变量赋值,并创建辅助地图。
    • 初始化起始节点,并将其加入开放列表。
  2. FindPath 函数中:
    • 每次循环,对于当前节点的周围 8 个点进行处理:
      • 根据方向计算点的位置,并检查斜对角是否可行走。
      • 如果点可行走且不在障碍区域,并且对角可走,则进行进一步处理:
        • 检查该点是否已经在开放列表中,如果是且当前 g 值更小,则更新相关信息。
        • 如果不在开放列表中,则计算 h 值和 f 值,将其加入树中、开放列表和当前节点的子节点组。
    • 如果开放列表为空,则结束循环。
    • 找出开放列表中 f 值最小的点,若为终点则停止循环,否则继续循环。
    • 标记当前点为已走过,并从开放列表中删除最小 f 值点。
    • 路径回溯,将路径节点存储在 retPath 中。
  3. PrintRoute 函数中:
    • 打印路径上的点坐标,并计算路径长度。
  4. PrintRouteMap 函数中:
    • 根据 pathMap 打印路线地图,标记出最短路径中的点。

4.1 A*.cpp

Astar.cpp

#include"astar.h"

//初始化
void Astar::Init(int **_map,int height,int width,MyPoint _beginPoint,MyPoint _endPoint){
    map = _map;
    ROW = height;
    COL = width;

    VerticalDist = 10; //每格到相邻格直线距离10
    ObliqueDist = 14;  //每格到相邻格斜线距离14

    beginPoint = _beginPoint;
    endPoint = _endPoint;

    //建立辅助地图
    pathMap = new PathNode*[ROW];
    for(int i=0;i<ROW;i++){
        pathMap[i] = new PathNode[COL];
        for(int j=0;j<COL;j++){
            pathMap[i][j].isfind = false;
            pathMap[i][j].isroute = false;
            pathMap[i][j].value = map[i][j];
        }
    }

    beginTreeNode = new MyTreeNode; //开放列表的起始节点
    memset(beginTreeNode, 0, sizeof(MyTreeNode));
    //向树中加入起点
    beginTreeNode->pos = beginPoint;
    //标记走过
    pathMap[beginTreeNode->pos.row][beginTreeNode->pos.col].isfind = true;

    pTemp = beginTreeNode;//初始化当前树节点为起始节点
    pTempChild = NULL;//探路点
}

//初始化后,获取路径
void Astar::FindPath(){
    while(1){
        //找出探路点周围8个可行点,保存到开放列表
        for(int i=0;i<8;i++){
            bool canWalkObliquely = true;//斜对角是否可行走
            pTempChild = new MyTreeNode;
            memset(pTempChild, 0, sizeof(MyTreeNode));
            pTempChild->pos = pTemp->pos;
            switch(i)
            {
            case p_up:
                pTempChild->pos.row = pTemp->pos.row -1;//只有行减1
                pTempChild->pos.col = pTemp->pos.col;
                pTempChild->pos.g = pTemp->pos.g + VerticalDist;
                break;
            case p_down:
                pTempChild->pos.row = pTemp->pos.row +1;
                pTempChild->pos.col = pTemp->pos.col;
                pTempChild->pos.g = pTemp->pos.g + VerticalDist;
                break;
            case p_left:
                pTempChild->pos.row = pTemp->pos.row;//行不变,列减1
                pTempChild->pos.col = pTemp->pos.col -1;
                pTempChild->pos.g = pTemp->pos.g + VerticalDist;
                break;
            case p_right:
                pTempChild->pos.row = pTemp->pos.row;//行不变,列加1
                pTempChild->pos.col = pTemp->pos.col +1;
                pTempChild->pos.g = pTemp->pos.g + VerticalDist;
                break;
            case p_leftup:
                if(isBarrier(pTemp->pos.row -1, pTemp->pos.col, pathMap) ||//判断当前点上边点是否为障碍
                    isBarrier(pTemp->pos.row, pTemp->pos.col -1, pathMap)   //判断当前点左边点是否为障碍
                   ){//判断斜角是否可走
                    canWalkObliquely = false;
                    break;
                   }
                pTempChild->pos.row = pTemp->pos.row -1;
                pTempChild->pos.col = pTemp->pos.col -1;
                pTempChild->pos.g = pTemp->pos.g + ObliqueDist;
                break;
            case p_leftdown:
                if(isBarrier(pTemp->pos.row +1, pTemp->pos.col, pathMap) ||//判断当前点下边点是否为障碍
                    isBarrier(pTemp->pos.row, pTemp->pos.col -1, pathMap)   //判断当前点左边点是否为障碍
                   ){//判断斜角是否可走
                    canWalkObliquely = false;
                    break;
                   }
                pTempChild->pos.row = pTemp->pos.row +1;
                pTempChild->pos.col = pTemp->pos.col -1;
                pTempChild->pos.g = pTemp->pos.g + ObliqueDist;
                break;
            case p_rightup:
                if(isBarrier(pTemp->pos.row -1, pTemp->pos.col, pathMap) ||//判断当前点上边点是否为障碍
                    isBarrier(pTemp->pos.row, pTemp->pos.col +1, pathMap)   //判断当前点右边点是否为障碍
                   ){//判断斜角是否可走
                    canWalkObliquely = false;
                    break;
                   }
                pTempChild->pos.row = pTemp->pos.row -1;
                pTempChild->pos.col = pTemp->pos.col +1;
                pTempChild->pos.g = pTemp->pos.g + ObliqueDist;
                break;
            case p_rightdown:
                if(isBarrier(pTemp->pos.row +1, pTemp->pos.col, pathMap) ||//判断当前点下边点是否为障碍
                    isBarrier(pTemp->pos.row, pTemp->pos.col +1, pathMap)   //判断当前点右边点是否为障碍
                   ){//判断斜角是否可走
                    canWalkObliquely = false;
                    break;
                   }
                pTempChild->pos.row = pTemp->pos.row +1;
                pTempChild->pos.col = pTemp->pos.col +1;
                pTempChild->pos.g = pTemp->pos.g + ObliqueDist;
                break;
            }
            //能走就加入当前节点的子节点组,并存入开放树openTree
            if(isRoad(pTempChild->pos, pathMap) && //是否可行
               canWalkObliquely //对角是否可走
               ){
                //检查是否已经在开放列表中
                bool isInOpenLst = false;
                for(it=openTree.begin();it != openTree.end();it++){
                    if( (*it)->pos.row == pTempChild->pos.row &&
                        (*it)->pos.col == pTempChild->pos.col
                       ){
                        isInOpenLst = true;
                        break;
                       }
                }
                if(isInOpenLst){
                    if( (*it)->pos.g > pTempChild->pos.g){
                        (*it)->pos.g = pTempChild->pos.g;//如果当前点g值大于开放列表中对映点的g值,就修改g
                        (*it)->pos.GetF();
                        (*it)->parent = pTemp;
                        pTemp->child.push_back(pTempChild);
                    }
                }
                if(isInOpenLst == false){
                    //计算h值
                    pTempChild->pos.h = GetH(pTempChild->pos,endPoint);
                    //计算f值
                    pTempChild->pos.GetF();
                    //入树
                    pTemp->child.push_back(pTempChild);
                    pTempChild->parent = pTemp;
                    //存入数组
                    openTree.push_back(pTempChild);

                }
            }

        }//--end--找出探路点周围8个可行点,保存到开放列表

        if(openTree.size() == 0) break;

        //找出当前点周围最小f值可行点
        it = openTree.begin();
        minF_Iter = it;
        //cout<<endl<<"在开放列表中的点: ";
        for(it = openTree.begin();it != openTree.end();it++){
            //cout<<(*it)->pos.row<<","<<(*it)->pos.col<<" ";
            if( (*minF_Iter)->pos.f > (*it)->pos.f){
                minF_Iter = it;
            }
        }
        //system("pause");


        //换层
        if((*minF_Iter)->pos.row == endPoint.row &&
           (*minF_Iter)->pos.col == endPoint.col
           )
            break;
        pTemp = (*minF_Iter);

        //标记走过
        pathMap[pTemp->pos.row][pTemp->pos.col].isfind = true;

        //把最小f值可行点从数组(open_list)中删除
        openTree.erase(minF_Iter);

    }//end--while(1)寻路

    //路径回溯
    MyTreeNode* node_line = (*minF_Iter);
    while(1){
        retPath.push_back(node_line);
        pathMap[node_line->pos.row][node_line->pos.col].isroute = true;
        node_line = node_line->parent;
        if(node_line == NULL) break;
    }
    cout<<endl;

}

void Astar::PrintRoute(){
    float routLength = 0;//路径总长度
    cout<<endl<<"route"<<"("<<retPath.size()<<"): ";
    for(it =retPath.begin();it != retPath.end(); it++){
        cout<<(*it)->pos.row<<","<<(*it)->pos.col<<" ";
        //计算路径长度并打印
        if(it > retPath.begin()){
            int row_t = (*it)->pos.row,col_t = (*it)->pos.col;//本次坐标
            int row_t_l = (*(it -1) )->pos.row,col_t_l = (*(it -1) )->pos.col;//上次坐标
            routLength += sqrt( pow( col_t - col_t_l,2) +pow( (row_t - row_t_l),2) );//pow次方函数
        }
    }
    cout<<endl;
    cout<<"routLength:"<<routLength;
}

void Astar::PrintRouteMap(){

    //打印路线地图
    cout << endl;
    for(int i=0;i < ROW;i++){
        for(int j=0;j < COL;j++){
            if(pathMap[i][j].isroute)
                cout<<"*";
            else cout<<pathMap[i][j].value;
        }
        cout<<endl;
    }

}

4.2 Astar.h

#include <iostream>
#include<windows.h>
#include<vector>
#include<cmath>

using namespace std;
using std::vector;

class Astar
{
public:
    struct MyPoint{
        int row;//行
        int col;
        int g,h,f;
        void GetF(){
            f = g + h;
        }
    };
    //方向枚举
    enum Direct{
        p_up,p_down,p_left,p_right,p_leftup,p_leftdown,p_rightup,p_rightdown
    };
    //辅助地图节点
    struct PathNode{
        int     value;//
        bool    isroute;//是否是最短路径中的一点
        bool    isfind;//是否走过
    };
    //树的节点类型
    struct MyTreeNode{
        MyPoint pos;
        MyTreeNode* parent;
        vector<MyTreeNode*> child;//用于存入该点的周围可行点?、、、、、、、、
    };

    int VerticalDist; //每格到相邻格直线距离10
    int ObliqueDist;  //每格到相邻格斜线距离14

    int ROW,COL;//地图数组行数,列数
    int **map;//地图数组

    //建立辅助地图
    PathNode **pathMap;
    MyPoint beginPoint;
    MyPoint endPoint;

    MyTreeNode* beginTreeNode;//开放列表的起始节点,即开始节点

    //创建指针:当前点、探路点
    MyTreeNode* pTemp;//当前点
    MyTreeNode* pTempChild;//探路点

    //创建数组,保存子节点
    vector<MyTreeNode*> openTree;//开放列表

    vector<MyTreeNode*>::iterator minF_Iter;//用于存放最小f值可行点的迭代器
    vector<MyTreeNode*>::iterator it;//用于检索的迭代器

    vector<MyTreeNode*> retPath;//储存最终路径

    //该点是否可行,可行返回true
    bool isRoad(const MyPoint& point,PathNode **_pathMap){
        if(point.col <0 || point.col >= COL ||
           point.row <0 || point.row >= ROW
           )//超出地图
           return false;
        if(1 == _pathMap[point.row][point.col].value)//该点为障碍
            return false;
        if(_pathMap[point.row][point.col].isfind)//该点已经走过
            return false;
        return true;
    }

    //判断点(row,col)是否为障碍物
    bool isBarrier(int row, int col, PathNode **_pathMap){
        if(col <0 || col >= COL ||
           row <0 || row >= ROW
           )//超出地图
           return true;
        if(1 == _pathMap[row][col].value)//该点为障碍
            return true;
        return false;
    }

    //计算h值
    int GetH(const MyPoint& point,const MyPoint& endpos){
        int x = abs(point.col - endpos.col);//取水平距离差绝对值
        int y = abs(point.row - endpos.row);//取竖直距离差绝对值
        return (x + y)*VerticalDist;
    }

    void Init(int **_map,int height,int width,MyPoint _beginPoint,MyPoint _endPoint);
    void FindPath();
    void PrintRoute();
    void PrintRouteMap();

};

4.3 地图包

@@@@@@@@@.@@@@@@@.@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@.@@@@@.@@@@@@@@@@@@@*
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
..............................@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@.............................@.........@...................@.............................@.........
@.............................@.............................@.............................@.........
@.............................@...........................................................@.........
@.............................@.............................@...................@.........@.........
@...........................................................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@...................
@...................@.........@.............................@...................@.........@.........
....................@.........@.............................@.............................@.........
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
..............................@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@.............................@.........@...................@.............................@.........
@.............................@.............................@.............................@.........
@.............................@...........................................................@.........
@.............................@.............................@...................@.........@.........
@...........................................................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@...................
@...................@.........@.............................@...................@.........@.........
....................@.........@.............................@.............................@.........
@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
..............................@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@.............................@.........@...................@.............................@.........
@.............................@.............................@.............................@.........
@.............................@...........................................................@.........
@.............................@.............................@...................@.........@.........
@...........................................................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@...................
@...................@.........@.............................@...................@.........@.........
....................@.........@.............................@.............................@.........
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
..............................@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@.............................@.........@...................@.............................@.........
@.............................@.............................@.............................@.........
@.............................@...........................................................@.........
@.............................@.............................@...................@.........@.........
@...........................................................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@...................
@...................@.........@.............................@...................@.........@.........
....................@.........@.............................@.............................@.........
@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
@.............................@.............................@...................@@@.......@.........
..............................@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@...................@@@@@@@@@@@.............................@.............................@.........
@.............................@.........@...................@.............................@.........
@.............................@.............................@.............................@.........
@.............................@...........................................................@.........
@.............................@.............................@...................@.........@.........
@...........................................................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@.........@.........
@.............................@.............................@...................@...................
@...................@.........@.............................@...................@.........@.........
....................@.........@.............................@.............................@.........
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@

这个需要存在map文件夹中的map100x100_small.txt

五、调用示例

以下是一个调用示例代码:

5.1 Main.cpp

#include <iostream> 
#include<cstring>
#include<fstream>//读写头文件
#include<time.h>
#include<windows.h>
#include"astar.h"

using namespace std;    //使用standard命名空间


int main(){
    system("mode con cols=120 lines=600");
    //行row,列col
    int height = 100;
    int width = 100;

    int start_x =1,start_y =1;
    int end_x   =5,end_y  =95;
    cout<<"地图尺寸(height*width): "<<height<<"*"<<width;
    cout<<endl<<"开始点(y,x):"<<start_y<<","<<start_x<<endl;
    cout<<"结束点(y,x):"<<end_y<<","<<end_x<<endl;

    time_t time_start_ms,time_end_ms;//时间记录ms

    //读取地图
    string filepath="map/map100x100_small.txt";
    ifstream fin(filepath.c_str());
    if(!fin) {cout<<endl<<"文件不存在"<<endl; system("pause");}

    int **pMap;//地图二维指针数组
    pMap = new int* [height];
    for(int i=0;i < height;i++){
        pMap[i] = new int[width];
        for(int j=0;j < width;j++){
            char c;
            fin>>c;
            if('.' == c) pMap[i][j] = 0;
            else pMap[i][j] = 1;
            //cout<<pMap[i][j];
        }
        //cout<<endl;
    }

    Astar::MyPoint startPoint = {start_y,start_x};
    Astar::MyPoint endPoint = {end_y, end_x};

    Astar astar;

    time_start_ms = clock();//a星寻路开始时间

    astar.Init(pMap, height, width, startPoint, endPoint);

    astar.FindPath();

    time_end_ms = clock();//a星寻路结束时间
    cout<<"a星寻路使用时间:"<<difftime(time_end_ms, time_start_ms)<<"ms";

    astar.PrintRoute();
    astar.PrintRouteMap();

    system("pause");

   
}

5.2 测试输出

点击运行Main.cpp,输出下面内容

地图尺寸(height*width): 100*100
开始点(y,x):1,1
结束点(y,x):95,5

a星寻路使用时间:1006ms
route(489): 95,5 95,6 94,7 93,8 92,9 92,10 92,11 93,12 94,13 95,14 95,15 96,16 97,17 98,18 99,19 99,20 99,21 98,22 97,23 96,24 95,25 95,26 95,27 95,28 94,29 94,30 94,31 94,32 94,33 94,34 94,35 94,36 94,37 94,38 94,39 94,40 94,41 94,42 94,43 94,44 94,45 94,46 94,47 94,48 93,49 93,50 93,51 93,52 93,53 93,54 93,55 93,56 93,57 93,58 92,59 92,60 92,61 93,62 94,63 95,64 95,65 95,66 95,67 95,68 96,69 96,70 96,71 95,72 95,73 95,74 95,75 95,76 95,77 94,78 93,79 93,80 93,81 94,82 94,83 94,84 94,85 94,86 94,87 94,88 94,89 94,90 94,91 94,92 94,93 93,94 92,95 91,96 90,96 89,96 89,95 88,94 87,93 86,92 85,91 85,90 85,89 86,88 86,87 86,86 86,85 86,84 86,83 86,82 86,81 86,80 86,79 87,78 88,77 89,76 89,75 89,74 89,73 89,72 89,71 89,70 89,69 89,68 89,67 89,66 89,65 88,64 87,63 86,62 85,61 85,60 85,59 86,58 87,57 88,56 88,55 88,54 88,53 88,52 88,51 88,50 88,49 88,48 88,47 88,46 88,45 87,44 86,43 85,42 84,41 84,40 84,39 85,38 86,37 87,36 88,35 89,34 89,33 89,32 89,31 89,30 89,29 89,28 89,27 89,26 89,25 88,24 87,23 86,22 85,21 85,20 85,19 85,18 85,17 84,16 83,15 82,14 81,13 80,13 79,13 79,14 79,15 79,16 78,17 77,18 76,19 76,20 76,21 76,22 76,23 76,24 76,25 75,26 74,27 73,28 72,29 72,30 72,31 73,32 74,33 75,34 75,35 75,36 75,37 75,38 75,39 75,40 75,41 75,42 75,43 75,44 75,45 75,46 75,47 74,48 73,49 73,50 73,51 73,52 73,53 73,54 73,55 73,56 73,57 73,58 72,59 72,60 72,61 72,62 71,63 70,63 69,63 69,64 69,65 69,66 69,67 68,68 67,69 67,70 67,71 67,72 66,73 65,74 64,75 63,76 62,77 61,78 60,78 59,78 58,78 57,79 57,80 57,81 56,81 55,81 54,82 53,83 52,84 51,85 50,85 49,85 48,85 47,86 46,87 45,88 44,89 44,90 44,91 44,92 44,93 43,94 42,95 41,96 40,96 39,96 39,95 38,94 37,93 36,92 35,91 35,90 35,89 36,88 36,87 36,86 36,85 36,84 36,83 36,82 36,81 36,80 36,79 37,78 38,77 39,76 39,75 39,74 39,73 39,72 39,71 39,70 39,69 39,68 39,67 39,66 39,65 38,64 37,63 36,62 35,61 35,60 35,59 36,58 37,57 38,56 38,55 38,54 38,53 38,52 38,51 38,50 38,49 38,48 38,47 38,46 38,45 37,44 36,43 35,42 34,41 34,40 34,39 35,38 36,37 37,36 38,35 39,34 39,33 39,32 39,31 39,30 39,29 39,28 39,27 39,26 39,25 38,24 37,23 36,22 35,21 35,20 35,19 35,18 35,17 34,16 33,15 32,14 31,13 30,13 29,13 29,14 29,15 29,16 28,17 27,18 26,19 26,20 26,21 26,22 26,23 26,24 26,25 25,26 24,27 23,28 22,29 22,30 22,31 23,32 24,33 25,34 25,35 25,36 25,37 25,38 25,39 25,40 25,41 25,42 25,43 25,44 25,45 25,46 25,47 24,48 23,49 23,50 23,51 23,52 23,53 23,54 23,55 23,56 23,57 23,58 22,59 22,60 22,61 22,62 21,63 20,63 19,63 18,63 17,63 16,64 15,65 14,66 13,67 12,68 11,69 10,69 9,69 9,68 8,67 7,66 6,65 5,64 4,63 3,62 2,61 2,60 2,59 3,58 4,57 5,56 5,55 5,54 5,53 5,52 5,51 5,50 5,49 6,48 7,47 7,46 7,45 7,44 7,43 7,42 7,41 7,40 7,39 7,38 7,37 7,36 7,35 7,34 6,33 5,32 4,31 4,30 4,29 5,28 6,27 7,26 8,25 8,24 8,23 8,22 8,21 8,20 8,19 8,18 8,17 8,16 8,15 8,14 8,13 8,12 7,11 7,10 7,9 7,8 7,7 6,6 5,5 4,4 3,3 2,2 1,1
routLength:559.245
1111111110111111101111111111011111111111111111111111111111111111110111111111111011111011111111111111
1*00000000100000000010000000001000000000100000000010000000001000000000000000000010000000001000000000
10*00000001000000000100000000010000000001000000000100000000***00000000100000000010000000001000000000
100*000000100000000010000000001000000000100000000010000000*010*0000000100000000010000000001000000000
0000*000001000000000100000000***0000000010000000001000000*00100*000000100000000010000000001000000000
10000*0000100000000010000000*010*0000000100000000********0001000*00000100000000010000000001000000000
100000*00010000000001000000*00100*00000010000000*0100000000010000*0000100000000010000000001000000000
1000000*****00000000100000*0001000**************001000000000100000*000100000000000000000001000000000
100000000010**************00001000000000100000000010000000001000000*00100000000010000000001000000000
10000000001000000000100000000010000000001000000000100000000010000000**100000000010000000000000000000
111111111111111111111111111111111111111111111111111111111111111111111*111111110111111011111111110111
100000000010000000001000000000100000000010000000001000000000100000000*100000000010000000001000000000
10000000000000000000100000000000000000000000000000100000000000000000*0100000000010000000001000000000
1000000000100000000010000000001000000000100000000010000000001000000*00100000000010000000001000000000
100000000010000000001000000000100000000010000000001000000000100000*000100000000010000000001000000000
10000000001000000000100000000010000000001000000000100000000010000*0000100000000010000000001000000000
1000000000100000000010000000001000000000100000000010000000001000*00000100000000010000000001000000000
100000000010000000000000000000100000000010000000001000000000100*000000000000000010000000000000000000
100000000010000000001000000000100000000010000000001000000000100*000000100000000010000000001000000000
000000000010000000001000000000100000000010000000000000000000100*000000100000000000000000001000000000
111111111111111011111111111111111110111111111111011111111111111*111111111111111111111111111111111011
100000000010000000001000000000100000000010000000001000000000100*000000000000000010000000001000000000
10000000001000000000100000000***000000001000000000100000000****0000000100000000010000000001000000000
1000000000100000000010000000*010*0000000100000000**********01000000000100000000010000000001000000000
000000000010000000001000000*00100*00000010000000*010000000001000000000100000000010000000000000000000
10000000001000000000100000*0001000**************0010000000001000000000100000000010000000001000000000
1000000000100000000*******00001000000000100000000010000000001000000000100000000010000000001000000000
100000000010000000*010000000001000000000100000000010000000001000000000100000000010000000001000000000
10000000000000000*0010000000001000000000100000000010000000001000000000100000000000000000001000000000
1000000000100****00010000000001000000000100000000010000000001000000000100000000010000000001000000000
1111111111111*11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1000000000100*00000010000000001000000000100000000010000000001000000000100000000010000000001000000000
10000000001000*0000010000000001000000000100000000010000000001000000000100000000010000000001000000000
100000000010000*000010000000001000000000100000000010000000001000000000100000000010000000001000000000
1000000000100000*0001000000000100000000***0000000010000000001000000000100000000010000000001000000000
10000000001000000*****0000000010000000*010*0000000100000000***000000001000000000100000000***00000000
0000000000100000000010*00000001000000*00100*00000010000000*010*0000000100000000**********010*0000000
10000000000000000000100*000000100000*0001000*000001000000*00100*00000010000000*01000000000100*000000
100000000010000000001000*0000010000*000010000************0001000*000001000000*0010000000001000*00000
1000000000100000000010000**********000001000000000100000000010000************000100000000010000**000
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111*111
100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000*000
10000000000000000000100000000010000000001000000000100000000000000000001000000000100000000010000*0000
1000000000100000000010000000001000000000100000000000000000001000000000100000000000000000001000*00000
10000000001000000000100000000000000000000000000000100000000010000000001000000000100000000*****000000
1000000000100000000010000000001000000000100000000010000000001000000000100000000010000000*01000000000
100000000010000000001000000000100000000010000000001000000000100000000000000000001000000*001000000000
10000000001000000000100000000010000000001000000000100000000010000000001000000000100000*0001000000000
1000000000100000000010000000001000000000100000000010000000001000000000100000000010000*00001000000000
0000000000100000000000000000001000000000100000000010000000001000000000100000000010000*00001000000000
1111111110111111101111111111011111111111111111111111111111111111110111111111111011111*11111111111111
1000000000100000000010000000001000000000100000000010000000001000000000000000000010000*00001000000000
100000000010000000001000000000100000000010000000001000000000000000000010000000001000*000001000000000
10000000001000000000100000000010000000001000000000100000000010000000001000000000100*0000001000000000
0000000000100000000010000000000000000000100000000010000000001000000000100000000010*00000001000000000
100000000010000000001000000000100000000010000000000000000000100000000010000000001*000000001000000000
100000000010000000001000000000100000000010000000001000000000100000000010000000001*000000001000000000
1000000000000000000010000000001000000000000000000010000000001000000000100000000***000000001000000000
100000000010000000000000000000100000000010000000001000000000100000000010000000*010000000001000000000
100000000010000000001000000000100000000010000000001000000000100000000010000000*010000000000000000000
111111111111111111111111111111111111111111111111111111111111111111111011111111*111111011111111110111
100000000010000000001000000000100000000010000000001000000000100000000010000000*010000000001000000000
10000000000000000000100000000000000000000000000000100000000000000000001000000*0010000000001000000000
1000000000100000000010000000001000000000100000000010000000001000000000100000*00010000000001000000000
100000000010000000001000000000100000000010000000001000000000100000000010000*000010000000001000000000
10000000001000000000100000000010000000001000000000100000000010000000001000*0000010000000001000000000
1000000000100000000010000000001000000000100000000010000000001000000000100*00000010000000001000000000
100000000010000000000000000000100000000010000000001000000000100000000****000000010000000000000000000
10000000001000000000100000000010000000001000000000100000000010000000*0100000000010000000001000000000
000000000010000000001000000000100000000010000000000000000000100*****00100000000000000000001000000000
111111111111111011111111111111111110111111111111011111111111111*111111111111111111111111111111111011
100000000010000000001000000000100000000010000000001000000000100*000000000000000010000000001000000000
10000000001000000000100000000***000000001000000000100000000****0000000100000000010000000001000000000
1000000000100000000010000000*010*0000000100000000**********01000000000100000000010000000001000000000
000000000010000000001000000*00100*00000010000000*010000000001000000000100000000010000000000000000000
10000000001000000000100000*0001000**************0010000000001000000000100000000010000000001000000000
1000000000100000000*******00001000000000100000000010000000001000000000100000000010000000001000000000
100000000010000000*010000000001000000000100000000010000000001000000000100000000010000000001000000000
10000000000000000*0010000000001000000000100000000010000000001000000000100000000000000000001000000000
1000000000100****00010000000001000000000100000000010000000001000000000100000000010000000001000000000
1111111111111*11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1000000000100*00000010000000001000000000100000000010000000001000000000100000000010000000001000000000
10000000001000*0000010000000001000000000100000000010000000001000000000100000000010000000001000000000
100000000010000*000010000000001000000000100000000010000000001000000000100000000010000000001000000000
1000000000100000*0001000000000100000000***0000000010000000001000000000100000000010000000001000000000
10000000001000000*****0000000010000000*010*0000000100000000***000000001000000000100000000***00000000
0000000000100000000010*00000001000000*00100*00000010000000*010*0000000100000000**********010*0000000
10000000000000000000100*000000100000*0001000*000001000000*00100*00000010000000*01000000000100*000000
100000000010000000001000*0000010000*000010000************0001000*000001000000*0010000000001000*00000
1000000000100000000010000**********000001000000000100000000010000************000100000000010000**000
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111*111
100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000*000
100000000***00000000100000000010000000001000000000100000000***000000001000000000100000000010000*0000
10000000*010*000000010000000001000000000100000000**********010*0000000100000000***000000001000*00000
1000000*00100*000000100000000********************01000000000100*00000010000000*010************000000
10000**0001000**000010000****01000000000100000000010000000001000*****010******0010000000001000000000
1000000000100000*0001000*00000100000000010000000001000000000100000000***0000000010000000001000000000
10000000001000000*00100*0000001000000000100000000010000000001000000000100000000010000000001000000000
100000000010000000*010*00000001000000000100000000010000000001000000000100000000010000000001000000000
0000000000100000000***000000001000000000100000000010000000001000000000100000000010000000001000000000
请按任意键继续. . .

六、总结

在这个示例中,我们首先读取地图文件,创建地图数组。然后定义起始点和
🥳🥳🥳现在,通过本教程,您学习了 A路径规划算法的 C++ 实现。理解和掌握该算法对于开发路径规划相关的应用至关重要,希望本文能帮助您更好地运用 A算法。🛹🛹🛹从而实现更高效的路径规划,为各种应用场景提供更好的解决方案。后期会持续分享 A * 算法的相关实用案例🥳🥳🥳,科学地合理地进行开发和应用,为推动相关领域的发展贡献一点微薄之力。🤣🤣🤣
如果您有任何问题,可以通过 q group (945348278) 加入鹏鹏小分队,期待与您思维的碰撞😘😘😘

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐