再帰と 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();
}
}