我正在为迷宫制作DFS和BFS解算器。
我对如何在C ++中实现Graph以及如何根据有多少个相邻单元格为空来实现具有多个子节点的节点一无所知(非常糟糕的知识)。
我一直在以初学者友好的方式搜索C ++中的图形。从字面上看。天。
我发现的一切对我来说都太复杂了,我只发现了一些我无法理解的高级东西。我发现的最适合初学者的网站是this,但是在这个网站中它使用的是C,它甚至实现了我认为在C ++中已经存在Stack类的堆栈。即使是这个网站我也很难理解。
我使用已经制作的库的问题是我永远不会学习如何实际实现图形和节点,我认为这将极大地伤害我对这个主题的了解。
当我输入这个时,我正在下载boost库,所以如果我决定使用一个库,我可能会使用这个库。
所以,我永远不应该学习如何创建图形和节点,只使用boost库(或其他任何其他内容),或者是否有实际的初学者友好方式来学习如何为DFS算法构建图形和节点,尤其是一个迷宫?
答案 0 :(得分:2)
由于DFS和BFS是微不足道的算法,因此无需从库中获取它们。是的,它们是在BGL中实现的,但是这个库主要用于更复杂的算法。此外,BGL确实提供了一些图形表示,但实际上是以您可以使用自己的图形数据结构并仍然应用BGL算法的方式实现的。但不同的是:自己实现图形和算法!
对于DFS和BFS,实现图形非常简单,因为您甚至不需要单独的边缘类型(除了指向的边缘之外没有存储边缘的附加数据)。要实现图形,您需要一个节点类型,它存储一个标志(表示该节点是否被访问)和一个带有目标节点指示符的容器。大多数情况下,容器只存储指向目标节点的指针,这当然意味着指向的节点会保留在内存中。
如果您只在一端添加/删除节点,则可以使用std::deque<Node>
;如果您可以在图表中的任何位置添加/删除节点,则可以使用std::list<Node>
(用于实现DFS和BFS)只添加可以在最后完成的节点,即我选择std::deque<Node>
)。在节点内部,您只需存储std::vector<Node*>
。在两个节点之间插入边时,您只需找到两个节点,并将指向源节点std::vector<Node*>
的指针添加到目标Node
。如果图形是无向的,则需要添加指向两个节点的std::vector<Node*>
的指针。
答案 1 :(得分:0)
您似乎不必将Node实现为复杂结构。 在节点中,节点仅代表迷宫的一个单元格,您可以使用整数来标识特定的单元格。
如果迷宫是MxN大小,你将拥有一个节点数组MxN lenght。
要表示节点之间的邻接关系,您可以使用邻接矩阵(在图表足够小的情况下可以使用)或邻接列表(在您的情况下效率更高,因为每个节点可以有4个或更少的相邻节点)。
您可以轻松搜索Google中的邻接表示。
所以,这就是你真的不需要复杂来阻止这些算法的情况。 您只需要数组(但最好是使用STL中的向量容器)和STL为BFS排队容器(DFS使用堆栈,但您可以使用明确使用堆栈的递归)。