Search code examples
algorithmarrayslanguage-agnosticmatrixmultidimensional-array

Get adjacent elements in a two-dimensional array?


I have a two-dimensional array, say

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

And i need to get all the numbers adjacent to 1(2, 3, 4, 5, 6, 7, 8, 9)

Is there a less ugly solution than:

topLeft = array[x-1][y-1]
top  = array[x][y-1]
topRight = array[x+1][y-1]
# etc

Thanks!


Solution

  • If you're not worried about the order, the cleanest is probably to use a couple of loops:

    result = new List<int>(8);
    for (dx = -1; dx <= 1; ++dx) {
        for (dy = -1; dy <= 1; ++dy) {
            if (dx != 0 || dy != 0) {
                result.Add(array[x + dx][y + dy]);
            }
        }
    }
    

    If the order is important, you can construct a list of all the (dx, dy) in the order you want and iterate over that instead.

    As pointed out in the comments, you probably want to add boundary checks. You could do that like this (assuming order doesn't matter):

    List<int> result = new List<int>(8);
    for (int dx = (x > 0 ? -1 : 0); dx <= (x < max_x ? 1 : 0); ++dx)
    {
        for (int dy = (y > 0 ? -1 : 0); dy <= (y < max_y ? 1 : 0); ++dy)
        {
            if (dx != 0 || dy != 0)
            {
                result.Add(array[x + dx][y + dy]);
            }
        }
    }