答案实际上取决于您发现问题中最重要的内容。如果您正在寻找效率和速度- 您添加的节点太多了。没必要这么多。
有效的方法
您的求解器只需要在路径的起点和终点以及地图上每个可能的拐角处的节点。像这样:
"#########",
"#oo#o o#",
"# ## ## #",
"#o oo#o#",
"#########"
没有真正需要测试地图上的其他地方 - 你要么必须穿过它们,要么甚至不需要费心测试。
如果它对你有帮助 - 我有一个模板digraph
类,我为简单的图形表示而设计。它写得不是很好,但它非常适合展示可能的解决方案。
#include <set>
#include <map>
template <class _nodeType, class _edgeType>
class digraph
{
public:
set<_nodeType> _nodes;
map<pair<unsigned int,unsigned int>,_edgeType> _edges;
};
我使用这个类来使用Dijkstra算法在塔防游戏中寻找路径。该表示应该足以满足任何其他算法。
节点可以是任何给定的类型——你可能最终会使用pair<unsigned int, unsigned int>
. 由他们在集合中连接_edges
两个。_nodes
position
易于编码的方法
另一方面 - 如果您正在寻找一种易于实现的方法 - 您只需将数组中的每个可用空间都视为一个可能的节点。如果这就是您要寻找的 - 无需设计图形,因为数组以完美的方式代表了问题。
你不需要专门的课程来解决这个问题。
bool myMap[9][5]; //the array containing the map info. 0 = impassable, 1 = passable
vector<pair<int,int>> route; //the way you need to go
pair<int,int> start = pair<int,int>(1,1); //The route starts at (1,1)
pair<int,int> end = pair<int,int>(7,3); //The road ends at (7,3)
route = findWay(myMap,start,end); //Finding the way with the algorithm you code
WherefindWay
有一个原型vector<pair<int,int>> findWay(int[][] map, pair<int,int> begin, pair<int,int> end)
,并实现了你想要的算法。在函数内部,您可能需要另一个 bool 类型的二维数组,它指示测试了哪些位置。
当算法找到路线时,您通常必须反向读取它,但我想这取决于算法。
在您的特定示例中, myMap 将包含:
bool myMap[9][5] = {0,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,1,0,
0,1,0,0,1,0,0,1,0,
0,1,1,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,0};
并且findWay
会返回一个vector
包含(1,1),(1,2),(1,3),(2,3),(3,3),(4,3),(4,2),(4,1),(5,1),(6,1),(7,1),(7,2),(7,3)