2015-06-13 2 views
2

Я пытаюсь использовать рекурсивные методы для решения лабиринта, представленного массивом int из 1s и 0s в Java. wasHere [] проверяет, прошел ли этот метод уже определенный набор координат, correctPath [] записывает путь ответа в лабиринт; оба из них инициализируются, при этом каждый индекс является ложным.Ошибка StackOverflow из-за рекурсии в Java

import java.awt.Point; 
class mazeSolver{ 
    int[][] maze; 
    int startX, startY; 
    int endX, endY;  
    int width, height; 
    boolean[][] wasHere, correctPath; 

    mazeSolver(int[][] m, int sX,int sY,int nX,int nY){ 
     maze = m; 
     width = maze[0].length; 
     height = maze.length; 
     startX = sX; 
     startY = sY; 
     endX = nX; 
     endY = nY; 
     System.out.println("Height: " + height + "\t Width: " + width); 

     correctPath = new boolean[height][width]; 
     wasHere = new boolean[height][width]; 
     for (int row = 0; row < maze.length; row++) 
     for (int col = 0; col < maze[row].length; col++){ 
      wasHere[row][col] = false; 
      correctPath[row][col] = false; 
     } 
     solveMaze(startX,startY); 
    } 

    public boolean solveMaze(int x, int y){ 
     boolean solvable = recursiveSolve(x,y); 
     return solvable; 
    } 

    private boolean recursiveSolve(int x, int y){ //1s are walls, 0s are free space 
     if (x == endX && y == endY) 
     return true; 
     if (wasHere[y][x] || maze[y][x] == 1) 
     return false; 

     wasHere[y][x] = true; 

     if (y < height-1){ 
     if (solveMaze(x,y+1)) 
      return true; 
     } 

     if (y > 0){ 
     if (solveMaze(x,y-1)) 
      return true; 
     } 

     if (x > 0){ 
     if (solveMaze(x-1,y)) 
      return true; 
     } 

     if (x < width-1){ 
     if (solveMaze(x+1,y)) 
      return true; 
     } 

     return false; 
    } 

    public int[][] getSolvedMaze(){ 
     for(int y = 0; y < height; y++) 
     for (int x = 0; x< width; x++) 
      if(correctPath[y][x]) 
       maze[y][x] = 2; 
     return maze; 
    } 
} 

Я застрял в этой ошибке за последние несколько часов, любая помощь будет принята с благодарностью.

+0

Вставьте свой полный код. – vinayc

+0

Возможно, нет ошибок. Насколько велик ваш лабиринт? Стек конечна, поэтому для каждого стека есть достаточно большой лабиринт, чтобы переполнить его. –

+0

@BarryFruitman Мой тестовый лабиринт 300x400. Я бы предпочел обрабатывать те, которые являются 2000x2000, хотя также – potatochemist

ответ

1

Я думаю, что нет такой ошибки (не то, что я могу видеть), но вы слишком много рекурсируете, что вызвало эту проблему. Я не уверен, какие ценности вы кормления в программу, но я был в состоянии заметить проблему с инициализацией выше программы с этими параметрами:

mazeSolver MazeSolver = new mazeSolver(new int [100][100], 0, 0, 100,100); 

Так, чтобы запустить программу, как-это, я увеличил размер стека. Вы можете сделать это, подав следующий параметр JVM при запуске программы: -Xss258m

Этот размер стека был способен разместить массив размером 1000. У меня не было много времени, чтобы проверить другие размеры.

mazeSolver MazeSolver = new mazeSolver(new int [1000][1000], 0, 0, 1000,1000); 
+0

Я установил аргументы run -Xss258m, как вы предложили, а затем -Xss2580m, и ни один из них не работал: /. Мой массив примерно 300x400, что нечетно, так как для вашего массива 1000x1000 работает 258 мегабайт. Спасибо за ввод, хотя. – potatochemist

+0

Можете ли вы показать, как вы это делаете? Если бы это сработало для меня, оно должно для вас. Также напечатайте «java -version» и вставьте его здесь, пожалуйста. – vinayc

+0

Вот как я побежал: ../jdk1.6.0_38/bin/java -Xss218m mazeSolver – vinayc

Смежные вопросы