1

したがって、再帰は私の強みではありません。値がゼロの場合、intのベクトルのベクトルを1で埋める再帰的なfloodFill関数を作成することに挑戦しました。私のコードは、私を超えた理由でセグフォールトを続けています。おそらく私のコードはその音をより明確にするでしょう。

これは、洪水で埋められるグリッドです。

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

}       
}  

ここでの目的は、ポイントの値がゼロであるかどうかを関数にチェックさせ、ゼロである場合は1に変更することです。次に、その上のものが同じかどうかを確認する必要があります。これは、1が見つかるか、ベクトルの終わりに到達するまで行われます。次に、別の方向を試し、上記と同じ条件になるまで、以下同様に、洪水がいっぱいになるまで進み続けます。

誰かが私がこれを修正するのを手伝ってもらえますか?多分私に何が悪いのか教えてください?

ありがとう!

4

3 に答える 3

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

基になるベクトルのインデックス-1にアクセスできるため、機能しません。x == 0

同じことが言えますfloodFill(x,y-1,G);

于 2012-05-17T01:16:49.490 に答える
1

このコードには多くの問題があります。まず、if(G.getValue(x,y))ある位置の値が 1 かどうかを で確認し、そうであれば で 1 に設定しG.setValue(x,y,1)ます。ちょっと考えてみてください、これは正しくありません。ゼロ以外の値を 1 に設定するのはいつですか?

次に、もう 1 つのより微妙な点は、既に 1 に設定されている場合は、隣人への再帰を行うべきではないということです。

現状では、どこから始めても接続されている 1 で永遠に再帰するため、スタックがオーバーフローするまでコードが実行される可能性があります。

于 2012-05-17T10:01:15.290 に答える
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)
}

同じ座標に複数回ヒットすることなくグリッドがいっぱいになると思います。また、いずれかのインデックスが範囲外の場合は常に返されるため、セグ フォールトの可能性はありません。

于 2012-05-17T02:00:25.157 に答える