为每个连接点集合通过所有连接点的算法

时间:2015-11-17 17:10:59

标签: c++ algorithm c++11

我试图通过2D数组中的每个“特殊”点进行一次,我做了一个递归函数,但是它多次经过几个点,因此特殊点的集合比它应该大得多。 / p>

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:我知道我可以线性地遍历每一行,如果条件为真,则添加到集合中,但我的最终目标是制作几个连接星号的集合,并且不知道应该有多少集合。

2 个答案:

答案 0 :(得分:1)

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

这是一个简短的教程,让您开始使用动态编程,它使用递归Fibonacci的典型示例(如果您不使用缓存,即动态编程,这当然会非常严重:)

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

答案 1 :(得分:1)

看起来您可以使用一系列广度优先搜索来查找连接星号的区域。您可以修改原始数组或该数组的副本,以标记已经访问过哪些坐标,或者星号的比例相对于整个板是否较小,那么将访问的坐标对存储起来可能更有效哈希表。