2015-06-13 52 views
2

我試圖用遞歸方法來解決由Java中的1和0的int數組表示的迷宮。 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

我按照你的建議將運行參數設置爲-Xss258m,然後設置爲-Xss2580m,但它們都不工作:/。我的數組大約是300x400,這是因爲你的1000x1000陣列有258兆字節的數據,這是很奇怪的。感謝您的輸入。 – potatochemist

+0

你能證明你是如何做到的嗎?如果它對我有用,它必須適合你。也請打印「java -version」並將其粘貼到此處。 – vinayc

+0

這是我跑的方式:../jdk1.6.0_38/bin/java -Xss218m mazeSolver – vinayc