algorithmGenerar Matriz Caracol, Spiral Matrix

Generar una matriz caracol o Spiral Matrix es un problema clásico en programación, especialmente cuando estamos iniciando a utilizar Arrays y una matriz es simplemente un array bidimensional.

Matriz Caracol o Spiral Matrix

Una matriz caracol tiene la forma de su nombre, por ejemplo una matriz cuadrada de tamaño 5 sería la siguiente:

La forma más sencilla de resolverlo es tener cuatro ciclos repetitivos que recorran los lados y uno extra para que repita esa operación en el caso de una dimensión 5 deberá repetirlo 2 veces y colocar un numero mas en el centro, en el caso de dimensión par entonces repetimos dimensión dividido entre 2 veces.

En el diagrama de flujo, n es la dimensión de la matriz cuadrada y x es un número con cual empezara a generar la matriz caracol.

Código

Método que genera la matriz caracol donde n es la dimensión de la matriz (matriz cuadrada) y x es el número por el cual empezará, por ejemplo puedes enviarle 1.

Java

public static int[][] generarMatrizCaracol(int n, int x) {
    int[][] M = new int[n + 1][n + 1];
    for (int a = 1; a <= n / 2; a++) {
        for (int i = a; i <= n - a; i++) {
            M[a][i] = x;
            x++;
        }
        for (int i = a; i <= n - a; i++) {
            M[i][n - a + 1] = x;
            x++;
        }
        for (int i = n - a + 1; i >= a + 1; i--) {
            M[n - a + 1][i] = x;
            x++;
        }
        for (int i = n - a + 1; i >= a + 1; i--) {
            M[i][a] = x;
            x++;
        }
    }
    if (n % 2 == 1) {
        M[n / 2 + 1][n / 2 + 1] = x;
    }
    return M;
}

Código completo en:

Tomar en cuenta que se genero matriz a partir de la posición (1, 1) sin embargo para la primera posición en Java es (0, 0), podemos cambiar ello de manera sencilla.

Swift

func generateSpiralMatrix(n: Int) -> [[Int]] {
    var value = 1
    var matrix: [[Int]] = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
    for ring in 0..<(n / 2) {
        for i in ring..<(n - ring - 1) {
            matrix[ring][i] = value
            value += 1
        }
        for i in ring..<(n - ring - 1) {
            matrix[i][n - ring - 1] = value
            value += 1
        }
        for i in ((ring + 1)..<(n - ring)).reversed() {
            matrix[n - ring - 1][i] = value
            value += 1
        }
        for i in ((ring + 1)..<(n - ring)).reversed() {
            matrix[i][ring] = value
            value += 1
        }
    }
    if n % 2 == 1 {
        matrix[n / 2][n / 2] = value
    }
    return matrix
}