ArrayIndexOutOfBoundsException при рекурсивном обходе 2D-массива для решения лабиринтаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ArrayIndexOutOfBoundsException при рекурсивном обходе 2D-массива для решения лабиринта

Сообщение Anonymous »

Мне нужно запрограммировать метод решения лабиринта (двумерного массива). Мне нужно всегда оставаться слева от стены, и мой метод должен закончиться, когда я достигну точки выхода (которая всегда находится в одном и том же положении) или когда решение невозможно (и после прохождения лабиринта , я снова в точке входа).
Все это я смог сделать, никаких проблем, я могу визуально убедиться, что он делает то, что я хочу (у нас есть получил от нашего инструктора еще несколько методов, которые выводят визуальные эффекты), и моя консольная отладка вывод тоже правильный.
Это соответствующий код:

Код: Выделить всё

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);
}
}
Есть только одна проблема: как правильно завершить рекурсию? Вот что я получаю из консоли:

Код: Выделить всё

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
Я понимаю ошибку, рекурсия явно не заканчивается там, где я хочу, а x или y увеличиваются и пытаются использовать индекс в массиве, которого нет.
Почему рекурсия не завершается оператором return, когда сбывается любая из этих ситуаций:

Код: Выделить всё

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;
}
Что мне нужно сделать, чтобы завершить это правильно?


Подробнее здесь: https://stackoverflow.com/questions/136 ... olve-a-maz
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»