我还没有实现任何东西,但是我正在考虑使用递归来识别网格中与给定单元“主动连接”的所有单元格,即“活动”且直接连接的单元格通过与其(活动)邻居之一共享面部,与所讨论的(活动)小区共享一个面部或更远距离/间接地连接。断开是因为网格中的一些单元可能被认为是“不活动的”(无论定义如何)。我的想法/伪代码如下:
//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;
}
我认为这涵盖了基本情况,标记了单元格,然后继续为其邻居,邻居的邻居做同样的事情,等等。这看起来不错吗?我缺少哪些明显的差距?如果任何具有图形连接和递归专业知识的人都可以权衡,我将不胜感激。我也很难找到迭代的等价物。任何有关这方面的想法都会受到高度赞赏。
提前致谢!
答案 0 :(得分:2)
此解决方案不起作用,因为它混合了“遍历”和“活动/连接”的概念。这两者是正交的:例如,一个单元可以是非活动的并且遍历,或者是活动的而不是遍历的。您的伪代码顶部的if
语句会返回true
,这是不正确的。
您应该保留一个表,该表将单独遍历的单元格标记为标记单元格活动的表格。您需要确保在进入递归调用之前标记遍历的单元格,否则解决方案可能太慢,甚至用完堆栈。
最后,解决方案不需要递归:您可以通过简单的Breadth-first search来完成所需的操作,这可以通过队列而不是递归来完成。
答案 1 :(得分:1)