2013-03-18 32 views
5

Uygulama için mayın tarama tekniğini yeniden yapıyorum ve IndexOutOfBounds hatalarını önlemek için bu küçük kodu yazdım. Bundan kaçınmanın bir yolu var mı? Bu yüzden, her olası hatayı bir if ifadesiyle açıkça yazmak zorunda değilim. Her dizimi 2 dizini daha büyük yapmayı ve sadece ilk ve son dizini görmezden gelmeyi düşündüm. Belli bir şey eksik miyim?Bu kod bloğundan kaçınmanın bir yolu var mı?

 if (row > 0 && col > 0) 
      ray[row - 1][col - 1] += 1; 
     if (row > 0) 
      ray[row - 1][col] += 1; 
     if (row > 0 && col < height - 1) 
      ray[row - 1][col + 1] += 1; 
     if (col > 0) 
      ray[row][col - 1] += 1; 
     if (col < height - 1) 
      ray[row][col + 1] += 1; 
     if (row < width - 1 && col > 0) 
      ray[row + 1][col - 1] += 1; 
     if (row < width - 1) 
      ray[row + 1][col] += 1; 
     if (row < width - 1 && col < height - 1) 
      ray[row + 1][col + 1] += 1; 

cevap

5

Bunun yerine bir döngü kullanabilir ve sınırları bir kez tanımlayabilirsiniz. gibi: işlem (size 1 ekleme bu kodda olduğu gibi) tersine çevrilebilir ise

int startRow = max(row - 1, 0); 
int endRow = min(row + 1, width - 1); 

int startCol = max(col - 1, 0); 
int endCol = min(col + 1, height - 1); 

for (int r = startRow; r <= endRow; r++) 
    for (int c = startCol; c <= endCol; c++) 
     if (r != row || c != col) //it looks like you want to skip this cell 
      ray[r][c] += 1; 

Alternatif olarak, sadece döngü sonra orta hücre için işlemi tersine çevirebilir. Bu, bu (en fazla) 12 karşılaştırmaları ortadan kaldırır çünkü daha verimli işlem kendisi basit mesafede olacaktır:

int startRow = max(row - 1, 0); 
int endRow = min(row + 1, width - 1); 

int startCol = max(col - 1, 0); 
int endCol = min(col + 1, height - 1); 

for (int r = startRow; r <= endRow; r++) 
    for (int c = startCol; c <= endCol; c++) 
     ray[r][c] += 1; 

//reverse the operation for the middle cell 
ray[row][col] -= 1; 
+0

Bir şey biraz uzak görünüyor. Neden "row = 3" ise 2'de başlamak istersiniz? – Makoto

+0

havalı. Ayrıca, min/max kullanarak daha açık olacaktır 'startRow = max (0, satır-1)' – ZhongYu

+0

@Makoto Sorunun içindeki kod tüm ışın [row] [col] 'ın komşuları etrafında dolaşıyor. Yani satır = 3' ise, eğer varsa, 2. hücreden 4. satıra tüm hücreleri kontrol etmek isteriz. –

2

Sen iç içe if ifadeleri kullanarak kod biraz kolaylaştırabilir. rowheight aracılığıyla 1 değişir izin, ben dizi daha büyük 2 n her bir boyutu yapma ile gitmek istiyorum, ancak

(Örneğin,. Defadan o row > 0 daha kontrol etmek gerek olmazdı) ve col1 değişir width aracılığıyla ve kenarlarında ne olduğunu görmezden gel. Kodunuzda

, bana geriye görünüyor height ile width ile row ve col eşleştirme gibi görünüyor.

+0

de döngü ile yapılabilir, satır ve genişliği de vardır yatay ve diğer ikisi de dikeydir. Daha doğal hissettim. Gruplama satırını> 0 olsa da düşünmedim. Teşekkürler! – elodin

+0

@elodin - Anladım, sanırım. Ancak, satırın indekslenmesi gibi 'row' değişkenini düşünüyorum; ve satırlar birbirinin üzerine yığıldığı için, 'height' sadece kaç tane satır olduğunu tanımlar. –

0

Evet

for(int r=row-1; r<=row+1; r++) 
for(int c=col-1; c<=col+1; c++) 
    if(r>=0 && r<ROWS && c>=0 && c<COLS && !(r==row && c==col)) 
     ray[r][c]++; 
İlgili konular