2017-10-20 149 views
-3

我的洪水填充方法:簡單洪水填充方法將導致錯誤計算器

public void fillNeighbours(int x, int y) { 
    for(int i = -1; i < 2; i++) { 
     for(int j = -1; j < 2; j++) { 
      try { 
       visible[x+i][y+j] = true; 

       if(num[x+i][y+j] == 0) { 
        fillNeighbours(x+i, y+j); 
       } 
      } catch (ArrayIndexOutOfBoundsException ignored) {} 
     } 
    } 
} 

catch (ArrayIndexOutOfBoundsException ignored) {}有用於避免從去所述陣列的外x和/或y位置。數組大小是30乘30。我正在製作掃雷遊戲。所以你可能知道爲什麼我需要這種方法以及它應該如何工作。如果你不知道什麼是掃雷艇那麼這裏就是關於那場比賽的快速視頻:Introduction to minesweeper

+1

你應該幾乎從不忽略/吞下這樣的例外。 –

+0

1.計算你的界限,不要使用arrayIndexOutofBoundsExceptions! 2.從你的代碼片斷中,我們看不到任何會終止你的循環的東西。你一直在調用fillNeighbours。檢查是否您的NUM [X + 1] [Y + J]改爲別的東西比0 –

回答

1

代碼重溫其設置爲可見已領域。

嘗試像

if(!visible[x+i][y+j]){ 
    visible[x+i][y+j] = true; 
    if(num[x+i][y+j] == 0) { 
    fillNeighbours(x+i, y+j); 
    } 
} 
+0

這或'如果(!可見[X + 1] [Y + J])'的OP代碼似乎要檢查一個變量但設置另一個。這就是說如果要填充的區域很大,堆棧仍然可能溢出。 – Persixty

+0

@Persixty當前數據表示需要兩個檢查。如果代碼在飛行中計算鄰居,則-1(假設)可以編碼visible = false,並且0 ... 8可以表示visible = true。 – tevemadar

+0

你可能是對的。 OP中的模型不完全清楚。 – Persixty

0

它看起來像你遞歸調用fillNeighbours沒有任何突圍條款(基本情況),因此呼籲填補堆棧。

Wikistack

遞歸的樹法律

  1. 遞歸算法必須有一個基本情況。
  2. 遞歸算法 必須改變它的狀態,並朝着基座殼體移動。
  3. 遞歸算法 必須調用本身,遞歸。
0

一旦fillNeighbours找到一個單元並調用它自己,當i和j等於零時,下一個循環總是會調用另一個循環。所以它永遠不會退出,並且一旦堆棧滿了就會崩潰。

除此之外,它會產生一個非常深的樹,因爲它不跟蹤這些細胞已被遞歸,並調用fillNeighbours同一細胞上多次。