error de desbordamiento de pila de Java FloodFill Problema

Mridul Mittal:

Estoy tratando de poner en práctica 4 vías problema FloodFill utilizando Java.
Flood Fill Algoritmo Wikipedia

Problema:

Tengo esta matriz

1 2 1
1 2 2
2 1 2

Ahora voy a seleccionar el elemento (0,1) de esta matriz y aplicar problema relleno de inundación a que esto cambie todos los 2 de los cuales satisfacen mi condición de recursividad a 3.

Mi matriz final debe ser:

1 3 1
1 3 3
2 1 3

He escrito un código java para el mismo, pero me da error StackOverflow. Puede alguien ayudarme a averiguar cómo evitarlo.

Aquí está mi código:

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

Error:

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)
Dillon Davis:

Su problema es en esta línea:

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

Incondicionalmente explorar las 4 direcciones de la celda actual en una búsqueda en profundidad, que en algún crea un bucle infinito recursividad como las palancas de búsqueda entre los mismos dos baldosas. Para solucionar este problema, ya sea

  • Realizar un seguimiento de las células exploradas, y no revisitarlos
  • Hacer una búsqueda en amplitud en lugar de DFS
  • Hacer una búsqueda en profundidad iterativa más profunda.

La forma más fácil sería modificar la siguiente línea

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

Para volver en su lugar si arr[x][y] != 2, esta opción efectiva implementos # 1, por lo que impide la exploración de células que ya han sido convertidos a 3, ya que 3 != 2hará que se return.

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=215426&siteId=1
Recomendado
Clasificación