2013-04-12 71 views
0

所以我有大部分的方法可以在掃雷遊戲中級聯顯示。我有一個解決方案的電路板,也是目前的電網之一。但問題是,當我進入0空間時,在遞歸調用時出現堆棧溢出錯誤。級聯顯示的掃雷遞歸

有沒有人有任何想法?

public static void revealCell(int row, int col, char[][] grid, char[][] answers) { 
    System.out.println(row + " " + col); 
    if(row < 0|| row > 4){ 
     System.out.println("bad"); 
     return; 
    } 
    if(col < 0|| col > 4){ 
     System.out.println("bad"); 
     return; 
    } 
    if(answers[row][col] == 'B'){ 
     grid[row][col] = answers[row][col]; 
     return; 
    } 
    if(answers[row][col] == '1'||answers[row][col] == '2'||answers[row][col] == '3'||answers[row][col] == '4'||answers[row][col] == '5'){ 
     grid[row][col] = answers[row][col]; 
     return; 
    } 

    if(answers[row][col] == '0'){ 
     System.out.println("go"); 
     grid[row][col] = answers[row][col]; 
     for(int i = row-1; i <= row +1; i++){ 
      for(int j = col-1; j<= col +1;j++){ 
       revealCell(i,j, grid, answers); 
      } 
     } 
    } 
} 

回答

0

這是因爲周圍的revealCell()力的維權它被一遍又一遍又一遍呼籲同0細胞。您可以跟蹤已經訪問過的單元格,並在調用revealCell()之前檢查該單元格。

+0

我將如何跟蹤已經使用的哪個0? – bforcer

+0

我想我想通了,我只是增加了 if(grid [i] [j]!='0') 圍繞遞歸調用 – bforcer

+0

另一個矩陣,我想。 – dmon

0

您的嵌套循環反覆調用revealCell(row, col, ...)。要麼重構您的循環,要麼只需插入一個if i!=row && j!=col後衛。

在此更改之後,您仍可能有無限遞歸。自從我編寫了一個掃雷遊戲以來,已經有一段時間了,但是IIRC爲了避免重複檢查同一個單元,我使用了四種不同的遞歸調用:一次調用從礦井碰撞點搜索板的左上象限(增加 - 行,減少列),搜索右上象限(增加行,增加列)等。