我正在为迷宫制作一个深度优先搜索(DFS)和广度优先搜索(BFS)解算器。
我对如何在C++中实现图形以及如何实现节点几乎一无所知,这些节点根据相邻单元格的空置情况可能有多个子节点。
我已经花了好几天时间寻找在C++中实现图形的初学者友好方法。真的。好几天了。
我找到的所有内容对我来说都太复杂了,我只找到了我无法理解的高级内容。我找到的最适合初学者的网站是这个,但这个网站使用的是C语言,并且还在实现堆栈,而我认为在C++中已经有了一个堆栈类。即使是这个网站,我也很难理解。
我使用现成库的问题在于,我永远不会学会如何实际实现图形和节点,我认为这会极大地损害我在这个主题上的知识。
我正在下载Boost库,所以如果我决定使用库,我可能会使用这个。
那么,我应该永远不学习如何创建图形和节点,而只使用Boost库(或其他任何库),还是有实际的初学者友好方法来学习如何为DFS算法构建图形和节点,尤其是为迷宫构建?
回答:
由于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*>
中添加指针。
顺便说一句,我不会称DFS或BFS为“人工智能”。另外,看起来你是在寻找C++的解决方案,即C标签似乎也放错了地方。