Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;连通图的递归_C++_Recursion_Graph_Connectivity - Fatal编程技术网

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不过这太傻了,所以我不能评论它是否有效。