Java泛洪填充问题堆栈溢出错误

Java泛洪填充问题堆栈溢出错误,java,arrays,algorithm,recursion,Java,Arrays,Algorithm,Recursion,我正在尝试使用java实现4路洪水填充问题。 问题: 我有这个矩阵 12 12 2 1 2 现在,我将选择该矩阵的元素(0,1),并对其应用泛洪填充问题,以将满足递归条件的所有2更改为3 我的最终矩阵应该是: 13 1 13 2 1 3 我已经为相同的代码编写了java代码,但它给了我StackOverflow错误。 谁能帮我想一想如何避免它 这是我的密码: import java.util.*; public class abc { static void printarray(int a

我正在尝试使用java实现4路洪水填充问题。

问题:

我有这个矩阵

12
12
2 1 2

现在,我将选择该矩阵的元素(0,1),并对其应用泛洪填充问题,以将满足递归条件的所有2更改为3

我的最终矩阵应该是:

13 1
13
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);
}

您的问题在这一行:

flood(arr,x-1,y);
flood(arr,x,y-1);
flood(arr,x,y+1);
flood(arr,x+1,y);
在深度优先搜索中,无条件探索当前单元格的所有4个方向,当搜索在相同的两个平铺之间切换时,在某个地方会创建一个无限递归循环。也要解决这个问题

  • 跟踪已探测的单元,不要重新访问它们
  • 执行广度优先搜索,而不是DFS
  • 进行迭代深化的深度优先搜索
最简单的方法是修改以下行

if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
    return;
}
if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
    return;
}
if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] != 2) {
    return;
}