2014-03-30 46 views
-1

我試圖解決使用二維數組的問題,這是一個迷宮中的老鼠的問題。避免在二維數組中出現異常

在檢查試圖編譯的條件時,它會發現一個數組索引越界異常......我如何檢查這些值,使其不會超出數組邊界?

static void solveMaze(){ 

    int nSteps = 0; // Number of steps. 
    int x = 0; int y = 0; // Starting point. 

    boolean mazeCompleted = false; 

    while (!mazeCompleted){ 

     if(x == maze.mazeMatrix.length && y == maze.mazeMatrix.length) 
      mazeCompleted = true; 

     else if(maze.mazeMatrix[x+1][y] == 0){ // Move right. 
      maze.mazeMatrix[x+1][y] = 2; 
      x++; nSteps++; 
     } 

     else if(maze.mazeMatrix[x-1][y] == 0){ // Move left. 
      maze.mazeMatrix[x-1][y] = 2; 
      x--; nSteps++; 
     } 

     else if(maze.mazeMatrix[x][y+1] == 0){ // Move down. 
      maze.mazeMatrix[x][y+1] = 2; 
      y++; nSteps++; 
     } 

     else if(maze.mazeMatrix[x][y-1] == 0){ // Move up. 
      maze.mazeMatrix[x][y-1] = 2; 
      y--; nSteps++; 
     } 

    } 

    maze.printMatrix(); 
    System.out.println("Maze COMPLETE! - With a total of " + nSteps + " steps."); 

} 

以前試過用兩個「for」循環來防止出界,但我不能在這個問題上走對角線。

+0

你可以分享堆棧跟蹤嗎? –

+0

最簡單的方法是實際使用2 for循環。否則,您可以在增加/減少前檢查該值是否有效。例如:if(x - > 0){x--;} –

+0

當x爲零時,您嘗試訪問x-1,作爲示例。你需要檢查x和你對零和迷宮的最大尺寸,*之前*試圖訪問一個鄰近的單元格。 –

回答

0

你的程序中有一個非常關鍵的錯誤。你永遠不會到達迷宮的盡頭!

if(x == maze.mazeMatrix.length && y == maze.mazeMatrix.length) 

引用超出界限的索引!它應該是

if(x == maze.mazeMatrix.length - 1 && y == maze.mazeMatrix.length - 1) 

你還需要檢查,看看是否您嘗試移動那裏之前,你可以&應該移動。 I.E. :

while (!mazeCompleted){ 

boolean moveRight = (x + 1 < mazeMatrix.length && maze.mazeMatrix[x+1][y] == 0 ? true : false); 
boolean moveLeft = (x - 1 >= 0 && maze.mazeMatrix[x-1][y] == 0 ? true : false); 
boolean moveUp = (y + 1 < mazeMatrix[x].length && maze.mazeMatrix[x][y+1] == 0 ? true : false); 
boolean moveDown = (y - 1 >= 0 && maze.mazeMatrix[x][y-1] == 0 ? true : false); 

和:

else if(moveRight) { // Move right. 
     maze.mazeMatrix[x+1][y] = 2; 
     x++; nSteps++; 
} 

等。雖然它似乎像這一點是應該遞歸解決,因爲如果在你最終會在迷宮中的任何環卡住無限循環。

+0

非常感謝:)!是的,這個問題應該使用回溯來解決,但它也可以遞歸地解決不了嗎? – Niconoid

+0

這個問題應該使用回溯來解決。你的算法根本不會回溯。使用遞歸將允許您回溯。 – casperw