2013-11-04 55 views
-1

我已經四處尋找這個問題,這個問題有一些答案,但沒有一個我真正理解/或不適合我。在二維數組中尋找8個鄰居

所以我的問題是包含字符的二維數組來檢查8個鄰居,*或O.

代碼:

aliveCheck = isAlive(g,row,column-1); 
if(aliveCheck){ 
    aliveCounter++; 
} 

aliveCheck = isAlive(g,row,column+1); 
if(aliveCheck == 1){ 
    aliveCounter++; 
} 

aliveCheck = isAlive(g,row+1,column); 
if(aliveCheck == 1){ 
    aliveCounter++; 
} 

等所有8個鄰居,這個工作,但我對解決方案不滿意。

的IsAlive()是一個簡單的函數來findout如果座標*或O.

任何人有一個更好的解決這個問題,或有關於如何提高它的任何提示?

感謝

+1

您對解決方案「不滿意」的方式是什麼? – nhgrif

+0

您可以嘗試使用行和列偏移進行循環,並編寫一個代碼塊來添加偏移量並僅更改每個循環的偏移量。 – Avery

+0

當有8個if語句後,代碼會變得非常長,並且我有興趣學習一些新的方法來解決這個問題@nhgrif – uzr

回答

2
for(int i=-1, i<=1; ++i) { 
    for(int j=-1; j<=1; ++j { 
     if((i || j) && isAlive(g,row+i,column+j)) { 
      aliveCounter++; } } } 

這種方法假定i-1i+1j-1,並且j+1都是你的陣列的範圍內。

還應該注意的是,儘管這種方法能夠在很少的幾行內完成你想要完成的任務,但它的可讀性要低得多。因此,這種方法應該伴隨着非常具有描述性的評論。此外,這種方法(或任何其他方法)最好用適當命名的函數包裝(例如checkNeighbors)。

+0

我剛要說! OP:觀察陣列上的邊界。 –

+0

你可以說'if(i && j && isAlive(g,row + i,column + j){...}' –

+0

嗯,真的好點@CharlieBurns除外,應該是'(i || j)&& isAlive (/ * etc * /)' – nhgrif