对于每个连接点集合,通过所有连接点一次的算法

Algorithm to pass through all the connected points once for each collection of connected points

本文关键字:连接点 算法 一次 集合 于每个      更新时间:2023-10-16

我试图遍历2D数组中的每个"特殊"点一次,我制作了一个递归函数,但它多次遍历多个点,从而使特殊点的集合比它应该的要大得多。

void foo(int x, int y) {
    if( Board(x,y) == '*' ) {
        Point newpoint(x, y, '*');
        dq.push_back(newpoint);
        foo(x, ++y);//down
        //foo(x, --y);//up, disabled up to avoid infinite loops
        foo(++x, y);//right
        foo(--x, y);//left
    }
}

例如,这可能是棋盘,foo将接收左上角星号的位置。

   asdf
      ****
       *****
    ****   ***
  4578       *   76767

这是已知的问题吗?它有我可以搜索的名字吗?

PS:我知道如果条件成立,我可以线性地遍历每一行,添加到集合中,但我的最终目标是创建几个连接星号的集合,不知道应该有多少集合。

使用动态编程:将已经通过的板坐标存储为bool 2D数组(foo()中的foo()static的非本地数组),然后在通过时将每个标记为已通过。然后仅当passed[i][j]false时调用递归。

这里有一个简短的教程,可以让你开始动态编程,它使用递归Fibonacci的典型例子(如果你不使用缓存,即动态编程,那么它的伸缩性当然会非常糟糕):

http://functionspace.com/articles/32/Fibonacci-series-and-Dynamic-programming

看起来可以使用一系列广度优先搜索来查找连接星号的区域。您可以在标记已访问的坐标时修改原始阵列或该阵列的副本,或者如果星号相对于整个板的比例较小,则将访问的坐标对存储在哈希表中可能更有效。