繁体   English   中英

将数组转换为节点

[英]Convert array to nodes

首先,我要说我对节点和图有非常基本的了解。

我的目标是为存储为数组的迷宫制作求解器。 我确切地知道如何实现求解算法(实际上我正在实现其中的几个),但是我的问题是,我对如何实现求解器将在每个空单元格中使用的节点感到非常困惑。

这是一个示例数组:

char maze[5][9] = 
        "#########",
        "#  #    #",
        "# ## ## #",
        "#     # #",
        "#########"

我的求解器从左上方开始,解决方案(退出)在右下方。

我已经阅读了有关节点如何工作以及如何实现图的知识,所以我认为我需要这样做:

  • 起点将成为一个节点
  • 每个节点将具有列和行号作为属性
  • 每个节点还将具有访问状态作为属性
  • 访问状态可以被visited ,被visited and leads to dead endnot visited
  • 每次访问节点时,每个直接相邻的,空白且未访问的单元都将成为访问节点的子节点
  • 每个访问的节点都放在solutionPath堆栈的顶部(并在地图上标记为“ *”)
  • 每个导致死角的节点都将从堆栈中删除(并在地图上标记为“〜”)

成品迷宫的示例:

"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"

基本上,我的问题是,我在这里用我的思维方式做的事真的很愚蠢(因为我对节点真的没有经验),如果可以,请向我解释原因? 另外,如果可能,请提供其他网站,以检查在实际应用程序中实现了图形示例的网站,以便我可以更好地掌握它。

答案确实取决于您发现问题中最重要的内容。 如果您正在寻找效率速度 -您添加的节点太多了。 不需要那么多。

高效的方法

您的求解器仅需要路径起点和终点以及地图上每个可能角点的节点。 像这样:

"#########",
"#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM