[英]Convert array to nodes
首先,我要说我对节点和图有非常基本的了解。
我的目标是为存储为数组的迷宫制作求解器。 我确切地知道如何实现求解算法(实际上我正在实现其中的几个),但是我的问题是,我对如何实现求解器将在每个空单元格中使用的节点感到非常困惑。
这是一个示例数组:
char maze[5][9] =
"#########",
"# # #",
"# ## ## #",
"# # #",
"#########"
我的求解器从左上方开始,解决方案(退出)在右下方。
我已经阅读了有关节点如何工作以及如何实现图的知识,所以我认为我需要这样做:
visited
,被visited and leads to dead end
, not visited
成品迷宫的示例:
"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"
基本上,我的问题是,我在这里用我的思维方式做的事真的很愚蠢(因为我对节点真的没有经验),如果可以,请向我解释原因? 另外,如果可能,请提供其他网站,以检查在实际应用程序中实现了图形示例的网站,以便我可以更好地掌握它。
答案确实取决于您发现问题中最重要的内容。 如果您正在寻找效率和速度 -您添加的节点太多了。 不需要那么多。
您的求解器仅需要路径起点和终点以及地图上每个可能角点的节点。 像这样:
"#########",
"#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)
的原型,其中findWay
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.