Я в конце своего остроумия. Один из моих домашних заданий требует, чтобы я взял двумерный массив, состоящий только из единиц и нулей, а затем "нашел выход , используя только рекурсию. " Существует очень мало спецификаций относительно того, что является целью, однако примеры, я предполагаю, что это означает, что нам нужно найти прямой путь к краю массива (представленный единицей) из любого отверстия с другой стороны (также представленной единицей).
Я часами пытался это выяснить, однако меня встречали только удручающе расплывчатые StackOverflowError и другие сообщения об ошибках, которые ничего не сообщали мне о том, что я делаю неправильно.
Мой (ужасный, грязный) код выглядит так:
public void checkForExitPath(int r, int c)
{
if(inBounds(r,c) && maze[r][c] == 1)
{
maze[r][c] = 9;
if(r == maze.length && c == maze[0].length)
{
exitFound = true;
System.out.println("Yay! Exit found!");
}
else
{
if(inBounds(r+1, c)) checkForExitPath(r+1, c);
if(inBounds(r, c+1)) checkForExitPath(r, c+1);
if(inBounds(r-1, c)) checkForExitPath(r-1, c);
if(inBounds(r, c-1)) checkForExitPath(r, c-1);
}
}
else
{
if(inBounds(r+1, c)) checkForExitPath(r+1, c);
if(inBounds(r, c+1)) checkForExitPath(r, c+1);
if(inBounds(r-1, c)) checkForExitPath(r-1, c);
if(inBounds(r, c-1)) checkForExitPath(r, c-1);
}
}
private boolean inBounds(int r, int c)
{
return (((r >= 0) && (r < maze.length)) && ((c >= 0) && (c < maze.length)));
}
, что всегда приводит к следующему:
Exception in thread "main" java.lang.StackOverflowError
at Maze.checkForExitPath(Maze.java:47)
at Maze.checkForExitPath(Maze.java:67)
at Maze.checkForExitPath(Maze.java:65)
at Maze.checkForExitPath(Maze.java:67)
at Maze.checkForExitPath(Maze.java:65)
at Maze.checkForExitPath(Maze.java:67)
at Maze.checkForExitPath(Maze.java:65)
И так далее, и так далее. Существует крайне скудная информация о том, что именно идет не так.
2D-массивы, которые необходимо решить, выглядят так:
1 0 0 0 1
1 1 1 1 0
0 0 1 0 1
0 1 1 1 0
0 0 0 0 1
(очевидно, нет выхода в этот массив)
1 0 0 0 0 1 1
1 1 1 1 0 1 0
0 0 1 0 0 1 0
0 1 1 1 0 1 0
0 1 0 1 0 1 0
0 1 0 1 1 1 0
0 1 0 1 0 0 1
(есть выход в этот массив)
1 0 0 0 0 1 0
1 1 1 1 0 1 0
0 0 1 0 0 1 0
0 1 1 1 0 1 0
0 1 0 1 0 1 0
0 1 0 1 1 1 0
0 1 0 1 0 1 0
(выхода нет)
1 0 1 1 0 1 0
1 1 1 1 1 1 0
0 0 1 0 0 0 1
0 1 1 1 1 1 1
0 1 0 1 0 1 0
1 1 1 1 1 1 0
0 1 0 1 0 1 0
(есть выход)
Я расстроен. Очень расстроен. И я боюсь, что я не могу понять это. Решение, вероятно, летит прямо над моей головой, мне просто нужна помощь, чтобы достичь его. Спасибо.