C++ 递归洪水填充函数?C++;

C++ 递归洪水填充函数?C++;,c++,function,recursion,flood-fill,C++,Function,Recursion,Flood Fill,所以递归不是我的强项,我被要求做一个递归泛洪填充函数,如果值为零,则用1填充int向量的向量。我的代码由于我无法理解的原因而不断出错。也许我的代码会让这听起来更清楚 这是要进行洪水填充的网格: vector<vector<int> > grid_; void floodFill(int x, int y, Grid & G) { if (G.getValue(x,y)) { G.setValue(x,y,1); if(x < G.get

所以递归不是我的强项,我被要求做一个递归泛洪填充函数,如果值为零,则用1填充int向量的向量。我的代码由于我无法理解的原因而不断出错。也许我的代码会让这听起来更清楚

这是要进行洪水填充的网格:

vector<vector<int> > 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);

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

这是我的洪水填充功能:

vector<vector<int> > 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);

}       
}  
void floodFill(int x、int y、Grid&G)
{
if(G.getValue(x,y))
{
G.设定值(x,y,1);
如果(x=0&&y=0)
漫灌(x+1,y,G);
如果(x=0&&y=0)
漫灌(x,y+1,G);
如果(x=0&&y=0)
漫灌(x-1,y,G);
如果(x=0&&y=0)
漫灌(x,y-1,G);
}       
}  
这里的目的是让函数检查点的值是否为零,如果为零,则将其更改为一。然后它应该检查上面的一个是否相同。它会这样做,直到找到1或到达向量的末尾。然后它尝试另一个方向,继续前进,直到与上面相同的条件,依此类推,直到洪水泛滥

有人能帮我修一下吗?也许告诉我怎么了

谢谢

if(x=0&&y=0)
if(x < G.getColumns()-1 && x >= 0 && y < G.getRows()-1 && y >= 0)
    floodFill(x-1,y,G);
漫灌(x-1,y,G);
不起作用,因为如果
x==0

同样适用于
洪水填充(x,y-1,G)

这个怎么样

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错误。

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

然后,另一个更微妙的点是,如果邻居已设置为1,则不应对其进行递归


就目前情况而言,您拥有的代码可能会一直运行到堆栈溢出为止,因为它将永远在连接到您从何处开始的1上递归。

除了lezebulon下面所说的,if条件看起来应该是
if(!G.getValue(x,y))
,假设
getValue
返回的是它听起来的样子。是的,我很确定你会得到一个无限循环,因为你一直在同一个caseslezebulon上写1,你完全正确,我现在让它工作了,但是它只写了一个1。我希望它不会要求太多,但是对于递归来说是个新手,我如何修改算法,使其能够在我的向量上爬行并填满它呢?它已经在索引中爬行了,所以我认为G.setValue(x,y,1);不能按预期工作您的代码是SEGFULT还是堆栈溢出?根据向量空间的大小,一个简单的递归泛洪填充算法甚至可以很快地吃掉一个大堆栈。从OP的评论中,我不确定他是在描述他编写的代码的意图还是功能需求。我猜我错误地假设了前者。