我应该使用图形库吗?

我正在为迷宫制作一个深度优先搜索(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标签似乎也放错了地方。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注