C++ C++;连通图的递归
我还没有实现任何东西,但我正在考虑使用递归来识别网格中与给定单元“主动连接”的所有单元,即通过与相关(主动)单元共享一个面而“主动”并直接连接的单元,或通过与其中一个单元共享一个面而实现更远距离/间接连接的单元(活动)邻居。断开连接是因为网格中的某些单元格可能被视为“非活动”(无论定义如何)。我的想法/伪代码如下:C++ C++;连通图的递归,c++,recursion,graph,connectivity,C++,Recursion,Graph,Connectivity,我还没有实现任何东西,但我正在考虑使用递归来识别网格中与给定单元“主动连接”的所有单元,即通过与相关(主动)单元共享一个面而“主动”并直接连接的单元,或通过与其中一个单元共享一个面而实现更远距离/间接连接的单元(活动)邻居。断开连接是因为网格中的某些单元格可能被视为“非活动”(无论定义如何)。我的想法/伪代码如下: //Call function to traverse connections traverse_connections(cell); //Traverse function de
//Call function to traverse connections
traverse_connections(cell);
//Traverse function definition
bool traverse_connections(cell) {
//Check if cell is inactive or traversed - base case
if (current cell is inactive or traversed) {
return true;
}
//-Mark cell then move on to its neighbors
Mark cell as traversed and add it to the list of 'actively connected' cells;
bool ok = true;
for(neighbor_cell in neighbors of cell) {
ok &= traverse_connections(neighbor_cell);
}
return ok;
}
我认为这涵盖了基本情况,标记了单元,然后继续对其邻居、其邻居的邻居等执行相同的操作。这看起来还好吗?是否有我遗漏的明显差距?如果任何在图形连接和递归方面有专长的人都能参与进来,我将不胜感激。我也很难提出一个迭代等价物如果您有任何关于这方面的想法,我们也将不胜感激
提前感谢!此解决方案不起作用,因为它混淆了“已遍历”和“活动/连接”的概念。这两个是正交的:例如,单元格可能处于非活动状态并被遍历,或者处于活动状态但未被遍历。伪代码顶部的
if
语句会同时返回true
,这是不正确的
您应该将标记已遍历单元格的表与标记活动单元格的表分开。在进行递归调用之前,您需要确保标记已遍历单元格,否则解决方案可能太慢,甚至耗尽堆栈
最后,解决方案不需要是递归的:您可以通过一种简单的方法来完成所需的工作,这种方法可以通过队列而不是递归来完成。此时标记单元格的方式很可能会给您带来问题。例如,如果您正在标记的其中一个单元格的相邻单元格需要进行转换之后,他们可能会不被追踪
如果你研究(A-Star)算法,它会给你一个关于图遍历的好主意也是另一种使用图遍历的算法。谢谢你的评论。我想我需要使用BFS来处理带循环的图。查找它。其实并不难。谢谢你的回答,但我做了一些研究,就像@dasblinkenlight提到的,我想我需要的是带循环的图的BFS。还没有查看a*appr不过这太傻了,所以我不能评论它是否有效。