2013-03-18 13 views
5

Sto rifacendo il dragamine per fare pratica e ho scritto questo bit di codice per evitare errori IndexOutOfBounds. C'è un modo per evitare questo, quindi non devo scrivere esplicitamente un'istruzione if ogni possibile errore? Ho pensato di rendere ogni array 2 più grande e di ignorare solo il primo e l'ultimo indice. Mi manca qualcosa di ovvio?C'è un modo per evitare questo blocco di codice?

 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; 

risposta

5

È possibile utilizzare un ciclo invece e definire i limiti una volta. Qualcosa di simile:

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; 

In alternativa, se l'operazione è reversibile (come in questo codice, si aggiunge 1), si può semplicemente invertire l'operazione per la cella centrale dopo il ciclo. Questo sarebbe più efficiente, in quanto elimina (al massimo) 12 confronti, a condizione che l'operazione stessa erano semplici:

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

Qualcosa sembra un po 'fuori. Perché dovresti iniziare da 2 se 'row = 3'? – Makoto

+0

cool. inoltre, usando min/max sarebbe più chiaro 'startRow = max (0, row-1)' – ZhongYu

+0

@Makoto Il codice nella domanda sta girando attorno a tutti i vicini di 'ray [row] [col]'. Quindi se 'row = 3', vogliamo controllare tutte le celle dalla riga 2 alla riga 4, se esistono. –

2

È possibile semplificare il codice un po 'utilizzando nidificate if dichiarazioni. (Per esempio, non si avrebbe bisogno di controllare che più di una volta row > 0.)

Tuttavia, mi piacerebbe andare con fare la matrice 2 più grande n ogni dimensione, diciamo row variano da 1 attraverso height e col variare da 1 attraverso width e ignorare cosa succede ai bordi.

Nel codice, ti sembra di essere abbinamento row con width e col con height, che sembra indietro per me.

+0

bene, riga e la larghezza sono entrambi orizzontale, e gli altri due sono entrambi verticali. Sembrava più naturale. Non pensavo di raggruppare la riga> 0 però. Grazie! – elodin

+0

@elodin - Vedo il tuo punto, immagino. Tuttavia, penso alla variabile 'row' come indicizzazione della riga; e poiché le righe si sovrappongono l'una sull'altra, 'height' definisce semplicemente quante righe ci sono. –

0

Sì, può essere fatto con ciclo 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]++; 
Problemi correlati