Imprimir matriz en espiral en Java

CorePress2024-01-25  18

Posible duplicado: imprimir matriz de orden en espiral

Estoy tratando de resolver una pregunta para imprimir una matriz en forma de espiral. Por ejemplo, si Entrada: matriz = [[1,2,3],[4,5,6],[7,8,9]], Salida: [1,2,3,6,9,8,7 ,4,5]

Aquí está mi algoritmo. Funciona como se esperaba, excepto que veo que 4 se imprime dos veces y realmente no puedo entender por qué.

public static void main(String[] args) {
        SprialMatrix spm = new SprialMatrix();
        int[][] inputArr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        int col = inputArr[0].length;
        int row = inputArr.length;
        spm.buildOutputArr(inputArr, row, col);

    }

    public void buildOutputArr(int[][] inputArr, int row, int column) {
        int top = 0, bottom = row - 1, left = 0, right = column - 1;
        int dir = 0;

        while (top <= bottom && left <= right) {
            // dir = 0, go from left to right
            if (dir == 0) {
                for (int i = left; i <= right; i++) {
                    System.out.println(inputArr[top][i]);
                }
            }

            else if (dir == 1) {
                // dir = 1, go from top to bottom
                top = top + 1;
                for (int i = top; i <= bottom; i++) {
                    System.out.println(inputArr[i][right]);
                }
            } else if (dir == 2) {
                // dir = 2, go from right to left
                right = right - 1;
                for (int i = right; i >= left; i--) {
                    System.out.println(inputArr[bottom][i]);
                }
            } else if (dir == 3) {
                // dir = 3, go from bottom to up
                bottom = bottom - 1;
                for (int i = bottom; i >= top; i--) {
                    System.out.println(inputArr[i][left]);
                }
            }
            dir = (dir + 1) % 4;
        }
    }

Parece que no puedo entender cuál es el problema en mi código. ¿Qué puedo probar a continuación?

¿Intentaste depurar el código?

- Joakim Danielson

28 de marzo de 2021 a las 7:57

¿Notaste que la matriz que estás probando no es cuadrada? ¿Eso importa para su algoritmo? ¿Por qué o por qué no? ¿Qué resultado espera para esa entrada específica? ¿Qué sucede cuando intentas rastrear tu algoritmo manualmente, paso a paso?

- Karl Knechtel

28 de marzo de 2021 a las 8:15

1

Noto que cuando dir==1, modificas top; cuando dir==2, modificas a la derecha; cuando dir==3, modificas la parte inferior; pero cuando dir==0, no modificas nada (excepto la i local). ¿Tiene eso sentido para ti? ¿Por qué?

- Karl Knechtel

28 de marzo de 2021 a las 8:18



------------------------------------

Para imprimir sólo matrices cuadradas

public static void printSpiral(int[][] m) {
    int s = m.length;
    for (int b = s - 1, c = 0, x = 0, y = 0, dx = 0, dy = 1; b > 0; b -= 2, x = y = ++c)
        for (int j = 0, t = 0; j < 4; ++j, t = dx, dx = dy, dy = -t)
            for (int i = 0; i < b; ++i, x += dx, y += dy)
                System.out.print(m[x][y] + " ");
    if (s % 2 == 1)
        System.out.print(m[s / 2][s / 2]);
    System.out.println();
}

Y

int size = 5;
int[][] m = new int[size][size];
for (int i = 0, n = 1; i < size; ++i)
    for (int j = 0; j < size; ++j, ++n)
        m[i][j] = n;
for (int[] row : m)
    System.out.println(Arrays.toString(row));
printSpiral(m);

salida:

[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20]
[21, 22, 23, 24, 25]
1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6 7 8 9 14 19 18 17 12 13

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare