我的任务是使用递归和 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();
}
}