首先让我说我对节点和图表有非常基本的了解。
我的目标是为一个存储为数组的迷宫制作一个求解器。我确切地知道如何实现解决算法(我实际上实现了几个)但我的问题是,我对如何实现求解器将在每个空单元格中使用的节点感到困惑。 / p>
这是一个示例数组:
char maze[5][9] =
"#########",
"# # #",
"# ## ## #",
"# # #",
"#########"
我的求解器从左上角开始,解决方案(出口)在右下角。
我已经了解了节点的工作原理以及图表的实现方式,所以我想想我需要做的是:
visited
,visited and leads to dead end
,not visited
完成迷宫的例子:
"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"
基本上我的问题是,我用我的思维方式在这里做了一些非常愚蠢的事情(因为我对节点缺乏经验)如果可以的话请你解释一下为什么?如果可能的话,还可以向我提供其他网站,以检查实际应用程序中图表的实例,以便我更好地掌握它。
答案 0 :(得分:1)
答案实际上取决于您在问题中最重要的内容。如果您正在搜索效率和速度,那么您添加的节点数量太多了。没有必要这么多。
您的求解器只需要路径起点和终点的节点,以及地图上每个可能的角落。像这样:
"#########",
"#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
。
另一方面 - 如果您正在寻找易于实现的方法 - 您只需将数组中的每个可用空间视为可能的节点。如果这就是你要找的东西 - 没有必要设计图形,因为数组以完美的方式表示问题。
您不需要专门的课程来解决这个问题。
findWay
vector<pair<int,int>> findWay(int[][] map, pair<int,int> begin, pair<int,int> end)
的原型为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};
,并实现您想要的算法。在函数内部,你可能需要另一个bool类型的二维数组,它表示测试了哪些地方。
当算法找到路线时,您通常需要反向读取它,但我想这取决于算法。
在您的特定示例中,myMap将包含:
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)