Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding neighbours in a two-dimensional array

Is there an easy way of finding the neighbours (that is, the eight elements around an element) of an element in a two-dimensional array? Short of just subtracting and adding to the index in different combinations, like this:

array[i-1][i] array[i-1][i-1] array[i][i-1] array[i+1][i] 

... And so on.

like image 764
Emil Svansø Avatar asked Mar 16 '09 20:03

Emil Svansø


2 Answers

(pseudo-code)

row_limit = count(array); if(row_limit > 0){   column_limit = count(array[0]);   for(x = max(0, i-1); x <= min(i+1, row_limit); x++){     for(y = max(0, j-1); y <= min(j+1, column_limit); y++){       if(x != i || y != j){         print array[x][y];       }     }   } } 

Of course, that takes almost as many lines as the original hard-coded solution, but with this one you can extend the "neighborhood" as much as you can (2-3 or more cells away)

like image 184
Seb Avatar answered Oct 31 '22 05:10

Seb


I think Ben is correct in his approach, though I might reorder it, to possibly improve locality.

array[i-1][j-1] array[i-1][j] array[i-1][j+1]  array[i][j-1] array[i][j+1]  array[i+1][j-1] array[i+1][j] array[i+1][j+1] 

One trick to avoid bounds checking issues, is to make the array dimensions 2 larger than needed. So, a little matrix like this

3 1 4 1 5 9 2 6 5 

is actually implemented as

0 0 0 0 0 0 3 1 4 0 0 1 5 9 0 0 2 6 5 0 0 0 0 0 0  

then while summing, I can subscript from 1 to 3 in both dimensions, and the array references above are guaranteed to be valid, and have no effect on the final sum. I am assuming c, and zero based subscripts for the example

like image 26
EvilTeach Avatar answered Oct 31 '22 03:10

EvilTeach