2013-03-18 108 views
5

我正在重建掃雷艇的練習,並寫了這一點的代碼,以避免IndexOutOfBounds錯誤。有沒有辦法避免這一點,所以我不必明確寫出一個if語句每一個可能的錯誤?我想讓每個數組的索引更大,並忽略第一個和最後一個索引。我錯過了明顯的東西嗎?有什麼辦法可以避免這段代碼?

 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; 

回答

5

您可以改爲使用循環並定義一次邊界。類似:

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; 

可替換地,如果操作是可逆的(如在該代碼時,所添加1),可以簡單地扭轉操作的循環後的中間單元。這將是更有效,因爲它消除了(最多)12個比較,所提供的操作本身很簡單:

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

東西似乎有點偏離。爲什麼你要從2開始,如果'row = 3'? – Makoto 2013-03-18 04:23:32

+0

很酷。另外,使用min/max會更清楚'startRow = max(0,row-1)' – ZhongYu 2013-03-18 04:26:43

+0

@Makoto問題中的代碼遍歷'ray [row] [col]'的所有鄰居。所以如果'row = 3',我們想要檢查從第2行到第4行的所有單元格,如果它們存在的話。 – 2013-03-18 04:27:23

2

您可以通過使用嵌套if語句簡化代碼的一個位。 (例如,你不會需要檢查一次該row > 0更多)

不過,我會去與製造陣列2更大的n每個維度,讓row1通過height各不相同,從col變化1通過width,並忽略邊緣發生了什麼。

在代碼中,你似乎是配對rowwidthcolheight,其向後我看來。

+0

好,行和寬度都水平的,另外兩個都是垂直的。感覺更自然。沒想到分組行> 0。謝謝! – elodin 2013-03-18 04:31:24

+0

@elodin - 我想你明白了。但是,我想'row'變量作爲索引行;由於行彼此堆疊,「高度」只是定義了有多少行。 – 2013-03-18 04:34:43

0

是的,這是可以做到的for循環

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]++; 
相關問題