我正在尝试使用Java实现4路充水问题。
Flood Fill Algorithm Wikipedia
问题:
我有这个矩阵
1 2 1
1 2 2
2 1 2
现在,我将选择此矩阵的元素(0,1)并对其应用洪水填充问题,以将满足递归条件的所有2都更改为3。
我的最终矩阵应该是:
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)
答案 0 :(得分:1)
您的问题在这条线上:
flood(arr,x-1,y);
flood(arr,x,y-1);
flood(arr,x,y+1);
flood(arr,x+1,y);
您可以在深度优先搜索中无条件地探索当前单元格的所有4个方向,当搜索在相同的两个图块之间切换时,该位置会创建无限递归循环。要解决此问题,
最简单的方法是修改以下行
if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
return;
}
要改为返回arr[x][y] != 2
,它可以通过阻止您浏览已经转换为3
的单元格来有效地实现选项#1,因为3 != 2
会将其转换为{{ 1}}。
return