递归floodFill函数? C ++

时间:2012-05-17 01:14:43

标签: c++ function recursion flood-fill

所以递归不是我的强项,我已经被要求制作一个递归floodFill函数,如果值为零,则填充1的向量向量的向量。由于我以外的原因,我的代码保持segfaulting。也许我的代码会使声音更清晰。

这是要填充的网格:

vector<vector<int> > grid_; 

它属于我创建的一个名为“Grid”的对象,它基本上是一组帮助操作向量的函数。网格的值初始化为全零。

这是我的洪水填充功能:

void floodFill(int x, int y, Grid & G)
{

if (G.getValue(x,y))
{
    G.setValue(x,y,1);
    if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x+1,y,G);

    if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x,y+1,G);

    if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x-1,y,G);

    if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x,y-1,G);

}       
}  

这里的目的是让函数检查点的值是否为零,如果是,则将其更改为1。然后它应该检查它上面的那个相同。它执行此操作直到它找到1或命中向量的末尾。然后它尝试另一个方向并继续前进,直到与上述相同的条件,依此类推,直到洪水充满为止。

任何人都可以帮我解决这个问题吗?也许告诉我什么错了?

谢谢!

3 个答案:

答案 0 :(得分:1)

if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x-1,y,G);

将无效,因为如果x == 0

,您可以访问基础向量的索引-1

floodFill(x,y-1,G);

也是如此

答案 1 :(得分:1)

这段代码有很多问题。首先,您使用if(G.getValue(x,y))检查某个位置的值是否为1,如果是,则使用G.setValue(x,y,1)将其设置为1。想想这一秒,这是不对的。您何时将非零值设置为1?

然后,另一个更微妙的一点是,如果已经将它们设置为1,则不应该将其递归到邻居中。

因为它代表你所拥有的代码可能会一直运行,直到你溢出堆栈为止,因为只要在连接到你开始的地方的那1个上永远递归。

答案 2 :(得分:0)

这个怎么样?

void floodFill(int x, int y, Grid &g) {
  if(x >= g.getColumns() || y >= g.getRows()) {
    return;
  }

  floodFill(x+1, y, g);

  if( x == 0 ) {
    floodFill(x, y+1, g);
  }

  g.setValue(x, y, 1)
}

我认为这将填充网格,而不是每次都多次击中相同的坐标,并且每当索引超出范围时,它就会返回,因此没有出现seg错误的可能性。