2

我正在为迷宫制作 DFS 和 BFS 求解器。

我不知道如何在 C++ 中实现 Graph 以及如何实现将有多个子节点的节点,具体取决于有多少相邻单元格是空的。

我一直在寻找一种初学者友好的方式来用 C++ 实现图形。字面上地。天。

我发现的一切对我来说都太复杂了,我只发现了我无法理解的高级东西。我发现的对初学者最友好的站点是这个,但在这个站点中它使用 C,它甚至实现了我相信在 C++ 中已经有一个 Stack 类的堆栈。即使这个网站我也很难理解。

我使用已经制作好的库的问题是我永远不会学习如何实际实现图形和节点,我认为这会极大地损害我对该主题的了解。

我在输入这个时正在下载 boost 库,所以如果我决定使用一个库,我可能会使用这个库。

所以我不应该学习如何创建图形和节点而只使用 boost 库(或任何其他的),还是有真正的初学者友好的方式来学习如何为 DFS 算法,特别是迷宫构建图形和节点?

4

2 回答 2

2

由于 DFS 和 BFS 是微不足道的算法,因此无需从库中获取它们。是的,它们是在BGL中实现的,但这个库主要用于更复杂的算法。此外,BGL 确实提供了一些图形表示,但实际上是以您可以使用自己的图形数据结构并仍然应用 BGL 算法的方式实现的。但不同的是:自己实现图形和算法!

对于 DFS 和 BFS,实现图形非常简单,因为您甚至不需要单独的边类型(没有为边所指向的位置存储额外的数据)。要实现图表,您需要一个节点类型,它存储一个标志(以指示该节点是否被访问)和一个带有目标节点指示器的容器。大多数情况下,容器只存储指向目标节点的指针,这当然意味着指向的节点保留在内存中。

std::deque<Node>如果您只在其中一个末端添加/删除节点,您可以使用 a或者std::list<Node>如果您可以在图中的任何位置添加/删除节点(为了实现 DFS 和 BFS,您只需添加可以在末端完成的节点,即我会去std::deque<Node>)。在节点内部,您只需存储一个std::vector<Node*>. 在两个节点之间插入一条边时,您只需找到这两个节点并将指向源节点的指针添加std::vector<Node*>到目标Node。如果图形是无向的,您将添加指向std::vector<Node*>两个节点的指针。

顺便说一句,我不会将 DFS 或 BFS 称为“人工智能”。此外,您似乎正在寻找 C++ 解决方案,即 C 标记似乎也放错了位置。

于 2013-11-10T13:22:09.587 回答
0

看来您不必将 Node 实现为复杂的结构。如果节点仅代表迷宫的一个单元格,您可以使用整数来标识特定单元格。

如果迷宫是 MxN 大小,您将有一个 MxN 长度的节点数组。

要表示节点之间的邻接关系,您可以使用邻接矩阵(在足够小的图形的情况下可以)或邻接列表(在您的情况下更有效,因为每个节点可以有 4 个或更少的相邻节点)。

您可以在 Google 中轻松搜索邻接表示。

所以,在这种情况下,你真的不需要任何复杂的东西来实现这些算法。您只需要数组(但最好使用来自 STL 的向量容器)和来自 STL 的用于 BFS 的队列容器(DFS 使用堆栈,但您可以使用显式使用堆栈的递归)。

于 2013-11-10T13:40:20.880 回答