gpt4 book ai didi

Java FloodFill Problem 堆栈溢出错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:24 26 4
gpt4 key购买 nike

我正在尝试使用 java 实现 4 路 floodfill 问题。
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)

最佳答案

你的问题在这一行:

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

您在深度优先搜索中无条件地探索当前单元格的所有 4 个方向,当搜索在相同的两个图 block 之间切换时,这会在某处创建无限递归循环。要解决此问题,要么

  • 跟踪探索过的细胞,不要再次访问它们
  • 做广度优先搜索而不是 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;
}

关于Java FloodFill Problem 堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54730639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com