gpt4 book ai didi

c++ - 将数组转换为节点

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:50 25 4
gpt4 key购买 nike

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

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

这是一个示例数组:

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

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

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

  • 起点将成为一个节点
  • 每个节点都有列号和行号作为属性
  • 每个节点还将具有访问状态作为属性
  • 已访问状态可以是已访问已访问并进入死胡同未访问
  • 每次访问一个节点时,每个直接相邻的、空的和未访问的单元格都成为被访问节点的子节点
  • 每个访问过的节点都放在 solutionPath 堆栈的顶部(并在 map 上标记为“*”)
  • 每个导致死胡同的节点都从堆栈中删除(并在 map 上标记为“~”)

完成的迷宫示例:

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

基本上我的问题是,我是不是在用我的思维方式做一些非常愚蠢的事情(因为我对节点真的没有经验),如果是的话,你能向我解释一下为什么吗?此外,如果可能的话,请提供其他网站以检查哪些图在实际应用程序中的实现示例,以便我可以更好地掌握它。

最佳答案

答案实际上取决于您认为问题中最重要的内容。如果您正在搜索效率速度 - 您添加的节点太多了。没必要这么多。

高效的方法

您的求解器只需要位于路径起点和终点的节点,以及 map 上每个可能的拐角处的节点。像这样:

"#########",
"#oo#o o#",
"# ## ## #",
"#o oo#o#",
"#########"

没有真正需要测试 map 上的其他地方 - 您要么必须穿过它们,要么甚至不需要费心测试。

如果对您有帮助 - 我有一个模板 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原型(prototype)为 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)

关于c++ - 将数组转换为节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com