2012-05-29 42 views
2

我在想,如果計數我可以添加布爾像數字。我正在做一些使用網格的東西,我希望它找到周圍的正方形並返回一個數字。 編輯: 這是我如何與布爾值。與布爾

int count = 0; 
for (int x = -1; x<=1;x++){ 
    for (int y = -1; y <=1;y++){ 
    if (grid[xPos+x][yPos+y]){ 
     count++; 
    } 
    } 
} 
+2

你如何計算布爾值?舉個例子,請 –

+3

這不是康威的生命遊戲,是嗎? –

+0

當x == 0和y == 0時,不要忘記不要計算中心位置,除非您確定要這樣做。另外,您是否需要檢查x <0或y的邊緣條件?是否最大X或Y>最大Y? –

回答

7
boolean[] bools = ... 
int sum = 0; 
for(boolean b : bools) { 
    sum += b ? 1 : 0; 
} 

這是假設你想true1false0

+0

@HovercraftFullOfEels這是,但我正在修改它,以便人們可以調整規則。 – Barakados

1

爲了增加傑弗裏的回答,不要忘記:

  • 如果你嵌套的for循環的中心細胞,不檢查網格,不加算。否則你正在計算鄰居數量的細胞本身。在您的情況,這是(x == 0 && y == 0)
  • 您需要檢查小區的邊緣,如果是確保你不是要算那些離開網格單元。我已經使用類似這樣的方法完成了這個工作:int xMin = Math.max(cellX - 1, 0);其中xMin是for循環之一的下界。我爲y做了類似的事情,並且類似於網格的最大邊。在您的代碼中,當xPos + x < 0xPos + x >= MAX_X(MAX_X是網格允許的最大x值的常量)時,會發生這種情況,並且y方面的情況類似。
0

什麼是你的目標是什麼?速度?可讀性?代碼簡潔?

如果你追求速度,想減少內存訪問的次數。如果你可以強制你的布爾值被存儲爲位,你可以使用>>和&來比較你在每行中關心的位。也許是這樣的:

byte grid[m][n/8]; 

int neighbor_count = 0; 
for (int row = yPos - 1; row < yPos + 1; row++) { 
    // calculate how much to shift the bits over. 
    int shift = 5 - (xPos - 1 % 8); 
    if (shift > 0) { 
    // exercise for the reader - span bytes. 
    } else { 
    // map value of on-bits to count of on bits 
    static byte count[8] = [0, 1, 1, 2, 1, 2, 2, 3]; 
    // ensure that only the lowest 3 bits are on. 
    low3 = (grid[row][xPos/8] >> shift) & 7; 
    // look up value in map 
    neighbor_count += count[low3]; 
    } 

警告編碼:這是未經測試,僅意味着說明。它也不包含邊界檢查:一種方法是從1迭代到max - 2,並有一個未設置單元的邊界。如果被評估的單元打開,你也應該減1。

這最終可能會比你有什麼要慢。您可以通過將位圖存儲在int32s中(或任何本地的)來進一步優化它。你也可以使用多線程,或者只是實現Hashlife :)

很明顯,這優化從簡潔可讀性。我認爲你的代碼具有最大的可讀性。

正如Jeffrey所暗示的,存儲一個稀疏的'on'布爾值數組可能比數組值更可取,這取決於你在做什麼。