我试图通过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:我知道我可以线性地遍历每一行,如果条件为真,则添加到集合中,但我的最终目标是制作几个连接星号的集合,并且不知道应该有多少集合。答案 0 :(得分:1)
使用动态编程:将已经传递的电路板坐标存储为bool
2D数组(foo()
中的非本地static
或foo()
},然后每当你通过它时,将每一个标记为通过。仅当passed[i][j]
为false
时才调用递归。
这是一个简短的教程,让您开始使用动态编程,它使用递归Fibonacci的典型示例(如果您不使用缓存,即动态编程,这当然会非常严重:)
http://functionspace.com/articles/32/Fibonacci-series-and-Dynamic-programming
答案 1 :(得分:1)
看起来您可以使用一系列广度优先搜索来查找连接星号的区域。您可以修改原始数组或该数组的副本,以标记已经访问过哪些坐标,或者星号的比例相对于整个板是否较小,那么将访问的坐标对存储起来可能更有效哈希表。