int AStar(int x, int y, int c) {//传入修道士野人数量和船的最大载客量 px = x; py = y; pc = c; Emptyresult(); bool pathMap[MaxSize + 1][MaxSize + 1][2] = { 0 };//用于记录走过的点,走过记为1 bool isFindEnd = false;//是否找到结果 //VecotrAdd(); if (x >= y && x > 0 && y > 0 && c > 1) { //创建树的根节点 TreeNode* pRoot = NULL; //初始化起点 AutoAStare::beginPos.x = x; AutoAStare::beginPos.y = y; AutoAStare::beginPos.z = left; //标记起点走过 pathMap[x][y][left] = true; //创建一棵树 pRoot = CreateNode(beginPos); //当前结点,初始值为根结点 TreeNode* current = pRoot; pRoot->pParent = NULL; bool flag = false; qint64 st = QDateTime::currentMSecsSinceEpoch(); qint64 ed = 0;
时间: 2023-06-25 21:06:30 浏览: 200
这是一个 A* 算法的实现,用于解决修道士与野人过河问题。传入参数 x、y、c 分别表示修道士数量、野人数量和船的最大载客量。该函数会返回一个整数,代表最短路径的长度。
在函数中,首先初始化起点位置和创建一棵树。然后,使用 pathMap 数组记录已经走过的位置,并将起点标记为已经走过。接着,将根结点设置为当前结点。
在之后的循环中,会不断地从当前结点开始,向周围的格子中搜索可以到达的位置,并计算到达该位置的代价(即距离加上估价函数)。如果找到了终点,则将 isFindEnd 设为 true,并跳出循环。
如果没有找到终点,则会选择代价最小的位置作为下一步的目标位置,并将该位置作为一个新的结点插入到树中。同时,将当前结点的指针指向新的结点,并更新当前位置为目标位置。如果发现当前位置已经走过,则跳过该位置。
最后,如果找到了终点,则会从终点往回遍历树,并记录下路径。如果没有找到终点,则返回 -1 表示无解。
相关问题
bool Astar::unWalk( int x,int y) { if (_MAP[x][y] == 1) return true; return false; }
这段代码是 A* 寻路算法中的一个函数,用于判断某个节点是否可以通过(即是否是障碍物)。如果该节点是障碍物,则返回 true,否则返回 false。
其中,x 和 y 表示节点的坐标,在地图中的表示是 MAP[x][y]。如果 MAP[x][y] 的值为 1,则表示该节点是障碍物,反之则不是。
该函数的命名比较不规范,建议改为 isWalkable 或者 isObstacle。
#ifndef _ASTAR_H #define _ASTAR_H #include <global_planner/planner_core.h> #include <global_planner/expander.h> #include <vector> #include <algorithm> namespace global_planner { class Index { public: Index(int a, float b) { i = a; cost = b; } int i; float cost; }; struct greater1 { bool operator()(const Index& a, const Index& b) const { return a.cost > b.cost; } }; class AStarExpansion : public Expander { public: AStarExpansion(PotentialCalculator* p_calc, int nx, int ny); virtual ~AStarExpansion() {} bool calculatePotentials(unsigned char* costs, double start_x, double start_y, double end_x, double end_y, int cycles, float* potential); private: void add(unsigned char* costs, float* potential, float prev_potential, int next_i, int end_x, int end_y); std::vector<Index> queue_; }; } //end namespace global_planner #endif
这是一个名为"AStarExpansion"的类的头文件,该类继承自"Expander"类,并实现了A*算法的路径规划功能。在命名空间"global_planner"中定义了该类。该类具有以下成员函数和成员变量:
成员函数:
- AStarExpansion:构造函数,接受一个PotentialCalculator指针对象和两个整数nx、ny作为参数。
- ~AStarExpansion:析构函数。
- calculatePotentials:计算路径规划的势能地图。接受一个unsigned char指针对象costs、四个double类型的起始点和终止点坐标、一个整数cycles和一个float类型指针对象potential作为参数。
成员变量:
- queue_:存储待扩展的节点的优先级队列。
另外,在代码中还定义了一个名为"Index"的类和一个名为"greater1"的结构体。
这段代码的作用是实现了A*算法的路径规划功能,并提供了计算势能地图的方法。
阅读全文