Obtener posiciones adyacentes de una matriz en Java

Hola a todos, hoy os voy a explicar como podemos obtener posiciones adyacentes de una matriz en Java.

Cuando tratamos una matriz, puede que necesitemos obtener las posiciones que hay alrededor de una posición concreta, conocido como las posiciones adyacentes.

Vamos a ir haciendo una función donde obtengamos las posiciones adyacentes de una posición concreta.

public static int[][] adyacentesA(int filas, int columnas, int filaOrigen, int columnaOrigen) {

}

Le pasamos las filas y columnas que tiene la matriz, asi no tenemos que pasarle las de un tipo concreto, asi no es necesario hacer una función para cada tipo (se podría hacer). También, le pasamos la fila y columna de origen donde partimos.

Devolveremos una matriz de x filas de 2 columnas.

Lo primero sería comprobar que la fila y columna de origen están dentro de la matriz. en caso de que no sea correcto, devolvemos un null, también se podría devolver una excepción. Lo hacemos asi:

if (!(filaOrigen >= 0 && 
        filaOrigen <= (filas - 1) && 
        columnaOrigen >= 0 && 
        columnaOrigen <= (columnas - 1))) {
    return null;
}

Ahora, debemos calcular cuántas posiciones adyacentes tenemos, podremos tener 3, 5 o 8. Veamos algunos ejemplos:

En la posición 0 0 de una matriz, sus posiciones adyacentes son 0 1, 1 0 y 1 1 (3 posiciones).

En la posición 0 1 de una matriz, sus posiciones adyacentes son 0 0, 0 2, 1 0, 1 1 y 1 2 (5 posiciones).

En la posición 1 1 de una matriz, sus posiciones adyacentes son 0 0, 0 1, 0 2, 1 0, 1 2, 2 0, 2 1 y 2 2 (8 posiciones).

Lo podemos representar en código de esta forma:

int numPosiciones;

if (filaOrigen == 0 || filaOrigen == (filas - 1)) {
    if (columnaOrigen == 0 || columnaOrigen == (columnas - 1)) {
        numPosiciones = 3;
    } else {
        numPosiciones = 5;
    }
} else {
    if (columnaOrigen == 0 || columnaOrigen == (columnas - 1)) {
        numPosiciones = 5;
    } else {
        numPosiciones = 8;
    }
}

Creamos nuestra matriz y recorremos de -1 a 1 con dos bucles para hacer las combinaciones. Eso sí, debemos tener en cuenta que la posición 0 0 debemos de obviarla. Al final solo devolvemos la matriz de posiciones.

int[][] posiciones = new int[numPosiciones][2];

int indicePosicion = 0;
for (int i = -1; i <= 1; i++) {
    for (int j = -1; j <= 1; j++) {

        if ((i != 0 || j != 0)
                && (filaOrigen + i) >= 0
                && (filaOrigen + i) <= (filas - 1)
                && (columnaOrigen + j) >= 0
                && (columnaOrigen + j) <= (columnas - 1)) {
            posiciones[indicePosicion][0] = filaOrigen + i;
            posiciones[indicePosicion][1] = columnaOrigen + j;
            indicePosicion++;
        }

    }
}

return posiciones;

Veamos un ejemplo de ejecución:

public static void main(String[] args) {

    int[][] m = {
        {0, 0, 0, 0},
        {0, 0, 0, 0},
        {0, 0, 0, 0},
        {0, 0, 0, 0}
    };

    int[][] posiciones3Pos = adyacentesA(m.length, m[0].length, 0, 0);

    System.out.println("3 posiciones");
    for (int i = 0; i < posiciones3Pos.length; i++) {
        for (int j = 0; j < posiciones3Pos[0].length; j++) {
            System.out.print(posiciones3Pos[i][j] + " ");
        }
        System.out.println("");
    }

    int[][] posiciones5Pos = adyacentesA(m.length, m[0].length, 1, 0);

    System.out.println("5 posiciones");
    for (int i = 0; i < posiciones5Pos.length; i++) {
        for (int j = 0; j < posiciones5Pos[0].length; j++) {
            System.out.print(posiciones5Pos[i][j] + " ");
        }
        System.out.println("");
    }

    int[][] posiciones8Pos = adyacentesA(m.length, m[0].length, 1, 1);

    System.out.println("8 posiciones");
    for (int i = 0; i < posiciones8Pos.length; i++) {
        for (int j = 0; j < posiciones8Pos[0].length; j++) {
            System.out.print(posiciones8Pos[i][j] + " ");
        }
        System.out.println("");
    }
}

El resultado es el siguiente:

Os dejo el código completo:

public class AdyacentesMatriz {

    public static void main(String[] args) {

        int[][] m = {
            {0, 0, 0, 0},
            {0, 0, 0, 0},
            {0, 0, 0, 0},
            {0, 0, 0, 0}
        };

        int[][] posiciones3Pos = adyacentesA(m.length, m[0].length, 0, 0);

        System.out.println("3 posiciones");
        for (int i = 0; i < posiciones3Pos.length; i++) {
            for (int j = 0; j < posiciones3Pos[0].length; j++) {
                System.out.print(posiciones3Pos[i][j] + " ");
            }
            System.out.println("");
        }

        int[][] posiciones5Pos = adyacentesA(m.length, m[0].length, 1, 0);

        System.out.println("5 posiciones");
        for (int i = 0; i < posiciones5Pos.length; i++) {
            for (int j = 0; j < posiciones5Pos[0].length; j++) {
                System.out.print(posiciones5Pos[i][j] + " ");
            }
            System.out.println("");
        }

        int[][] posiciones8Pos = adyacentesA(m.length, m[0].length, 1, 1);

        System.out.println("8 posiciones");
        for (int i = 0; i < posiciones8Pos.length; i++) {
            for (int j = 0; j < posiciones8Pos[0].length; j++) {
                System.out.print(posiciones8Pos[i][j] + " ");
            }
            System.out.println("");
        }
    }

    public static int[][] adyacentesA(int filas, int columnas, int filaOrigen, int columnaOrigen) {

        if (!(filaOrigen >= 0 && 
                filaOrigen <= (filas - 1) && 
                columnaOrigen >= 0 && 
                columnaOrigen <= (columnas - 1))) {
            return null;
        }

        int numPosiciones;

        if (filaOrigen == 0 || filaOrigen == (filas - 1)) {
            if (columnaOrigen == 0 || columnaOrigen == (columnas - 1)) {
                numPosiciones = 3;
            } else {
                numPosiciones = 5;
            }
        } else {
            if (columnaOrigen == 0 || columnaOrigen == (columnas - 1)) {
                numPosiciones = 5;
            } else {
                numPosiciones = 8;
            }
        }

        int[][] posiciones = new int[numPosiciones][2];

        int indicePosicion = 0;
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {

                if ((i != 0 || j != 0)
                        && (filaOrigen + i) >= 0
                        && (filaOrigen + i) <= (filas - 1)
                        && (columnaOrigen + j) >= 0
                        && (columnaOrigen + j) <= (columnas - 1)) {
                    posiciones[indicePosicion][0] = filaOrigen + i;
                    posiciones[indicePosicion][1] = columnaOrigen + j;
                    indicePosicion++;
                }

            }
        }

        return posiciones;

    }

}

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.