1

再帰と 2D Ascii イメージを使用して、Java でフラッド フィル アルゴリズムを作成するタスクがあります。私はコードを書き、それは完全に機能しますが、現在のポイント (エッジ、コーナー、または中間) がどこにあるかなどを確認するために if ステートメントを使いすぎたため、より簡単に記述できるかどうかわかりません。

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

public class AsciiShop {

public static void main(String[] args) {
    String[] img = new String[5];

    img[0] = "++++++#";
    img[1] = "+#+++##";
    img[2] = "###++#+";
    img[3] = "+#++#++";
    img[4] = "+####++";


    fill(img, 1, 2, '0');

}

public static void fill(String[] image, int x, int y, char c) {

    String[] finalImage = image;

    char startChar = finalImage[y].charAt(x);

    StringBuilder stringBuilder = new StringBuilder(finalImage[y]);
    stringBuilder.setCharAt(x, c);

    finalImage[y] = stringBuilder.toString();

    if(y>0&&x>0&&y<(finalImage.length-1)&&x<(finalImage[y].length()-1)) {
        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);
    } 
    else if(y==0&&x==0) {

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);

    }

    else if (y==0&&x==(finalImage[y].length()-1)) {
        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);
    }

    else if (y==finalImage.length&&x==(finalImage[y].length()-1)) {

        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

    }

    else if (y==finalImage.length&&x==0) {

        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);

    }

    else if (y==0&&x>0&&x<(finalImage[y].length()-1)){

        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);
    }

    else if (y==(finalImage.length-1)&&x>0&&x<(finalImage[y].length()-1)){
        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);
    }

    else if (x==0&&y>0&&y<(finalImage.length-1)) {


        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

        //Rechter Nachbar
        if(finalImage[y].charAt(x+1) == startChar)
            fill(finalImage, x+1, y, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);
    }
    else if (x==(finalImage[y].length()-1)&&y>0&&y<(finalImage.length-1)) {

        //Linker Nachbar
        if(finalImage[y].charAt(x-1) == startChar)
            fill(finalImage, x-1, y, c);

        //Nachbar oben
        if(finalImage[y-1].charAt(x) == startChar)
            fill(finalImage, x, y-1, c);

        //Nachbar unter
        if(finalImage[y+1].charAt(x) == startChar)
        fill(finalImage, x, y+1, c);
    }

    for (int i=0; i<finalImage.length; i++) {
        System.out.println(finalImage[i]);
    }

    System.out.println();

}
}
4

2 に答える 2