javaalgorithmrecursionmaze

ArrayIndexOutOfBoundsException while walking 2D array recursively to solve a maze


I need to program a method to solve a maze (2-dimensional array). I need to stay directly left of the wall at all times and my method should end when either I've reached the exit point (which is always at the same position) or when there is no solution possible (and, after running through the maze, I'm back at the entry point).

I was able to do that all, no problems, I can visually ensure that it's doing what I want it to do (we've got some other methods from our instructor which output the visuals), and my console debug output is right as well.

This is the relevant code:

public static void main(String[] args) {
    maze = generateMaze(10,10);
    walk(1,0,0);
}

public static void walk(int x, int y, int direction) {
    System.out.println("x = " + x + " y = " + y); //debug output
    draw(x,y,maze); //draws current position
    if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
        System.out.println("Geschafft!");
        return;
    }
    if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
        System.out.println("Keine Lösung möglich.");
        return;
    }
    if (direction == 0) { //go down
        if (maze [x][y+1]) {
            walk(x,y,1);
        }
        walk(x,y+1,2);
    }
    if (direction == 1) { //go right
        if(maze [x+1][y]) {
            walk(x,y,3);
        }
        walk(x+1,y,0);
    }
    if (direction == 2) { //go left
        if(maze [x-1][y]) {
            walk(x,y,0);
        }
        walk(x-1,y,3);
    }
    if (direction == 3) { //go up
        if(maze[x][y-1]) {
            walk(x,y,2);
        }
        walk(x,y-1,1);
    }    
}

There's just one problem: how do I end my recursion correctly? This is what I get form the console:

x = 1 y = 0
x = 1 y = 1
x = 1 y = 1
x = 1 y = 2
and so on...
x = 8 y = 8
x = 9 y = 8
Geschafft!
x = 8 y = 9
x = 8 y = 9
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at maze.MazeSolution.walk(MazeSolution.java:26)
at maze.MazeSolution.walk(MazeSolution.java:39)
and some more of that

I do understand the error, the recursion obviously doesn't end where I want it to, and x or y are increased and tried to use an index in the array that isn't there.

Why doesn't the recursion end with the return statement, when either of these situations come true:

if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
    System.out.println("Geschafft!");
    return;
}
if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
    System.out.println("Keine Lösung möglich.");
    return;
} 

What do I need to do to end it correctly?


Solution

  • Look at your returns and where you may return to. You can return in the middle of your enclosing function which has other calls to walk, without the guards to ensure they're not called.

    I recommend re-implementing your logic; think about having if/else pairs to ensure mutual exclusion.