JavaのFLOODFILL問題スタックのオーバーフローエラー

Mridulミタル:

私はJavaを使用した4ウェイFLOODFILL問題を実装しようとしています。
塗りつぶしアルゴリズムウィキペディア

問題:

私はこの行列を持っています

1 2 1
1 2 2
2 1 2

今私は、この行列の要素(0,1)を選択し、3つの者への私の再帰条件を満たすすべての2人の者を変更するには、このに塗りつぶしの問題を適用します。

私の最後の行列は次のようになります。

1 3 1
1 3 3
2 1 3

私は同じのためのJavaコードを書かれているが、それは私にStackOverflowのエラーが発生します。誰の助けを借り、私はそれを回避する方法把握することができます。

ここに私のコードは次のとおりです。

import java.util.*;
public class abc {

static void printarray(int a[][])
{
    for ( int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            System.out.print(a[i][j]+ " ");
        }
        System.out.println();
    }

}
static void flood(int arr[][],int x,int y) {
    //base cases
    if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
        return;
    }


    // i have made a dimension specific function but i can generalize it !.
    arr[x][y] = 3;
    flood(arr,x-1,y);
    flood(arr,x,y-1);
    flood(arr,x,y+1);
    flood(arr,x+1,y);
}

public static void main(String[] args) {
    int screen[][] = {
            {1, 2, 1},
        {1, 2,2},
        {2,1,2}
    };

    flood(screen,0,1);
    printarray(screen);
}

エラー:

Exception in thread "main" java.lang.StackOverflowError
at java.base/sun.nio.cs.UTF_8.updatePositions(UTF_8.java:79)
at java.base/sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:509)
at java.base/sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:564)
at java.base/java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:576)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:292)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:211)
at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
at java.base/java.io.PrintStream.newLine(PrintStream.java:624)
at java.base/java.io.PrintStream.println(PrintStream.java:772)
at abc.flood(abc.java:19)
at abc.flood(abc.java:30)
at abc.flood(abc.java:30)
at abc.flood(abc.java:33)
at abc.flood(abc.java:30)
at abc.flood(abc.java:33)
ディロンデイビス:

あなたの問題は、この行にあります:

flood(arr,x-1,y);
flood(arr,x,y-1);
flood(arr,x,y+1);
flood(arr,x+1,y);

あなたは無条件にどこかで同じ2つのタイルの間の検索トグルとして無限再帰ループを作成し、深さ優先探索で現在のセルから、すべての4つの方向を探ります。いずれか、この問題を解決するために、

  • 調査した細胞を追跡し、それらを再訪していません
  • 代わりに、DFSの幅優先探索を実行します。
  • 繰り返し-深め深さ優先探索を行います。

最も簡単には、次の行を変更するだろう

if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
    return;
}

場合の代わりに戻りarr[x][y] != 2、これは効果的に、すでにに変換された細胞探検からあなたを防止することにより、オプション#1を実装して3いるので、3 != 2それを引き起こしますがreturn

if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] != 2) {
    return;
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215423&siteId=1