Online C Compiler
Abrir en el compilador

Edición didáctica en español. El código y sus salidas conservan el original.

Rotación de una matriz 90 grados

Gira una matriz cuadrada 90 grados en sentido horario sin crear una segunda matriz.

Abrir en el compilador

Rotación de una matriz 90 grados
Gira una matriz cuadrada 90 grados en sentido horario sin crear una segunda matriz.

Lee N y una matriz de N × N enteros. Modifica la propia matriz y muestra el resultado del giro horario. Debes usar O(1) de memoria auxiliar: no reserves otra matriz para el resultado.

Una forma de resolverlo consiste en transponer la matriz y después invertir el orden de los elementos de cada fila. Para una matriz de una sola celda, el resultado no cambia.

Entrada

Primera línea: N. Las siguientes N líneas contienen N enteros separados por espacios.

Salida

N filas de la matriz girada, con valores separados por espacios.

Restricciones

  • 1 <= N <= 20
  • -1000 <= matrix[i][j] <= 1000
  • O(1) de memoria auxiliar.
Pistas
  • En la transposición, empieza con j = i + 1 para no intercambiar dos veces.
  • Invierte cada fila con dos índices que se acercan desde sus extremos.

Código C

#include <stdio.h>

#define MAX_N 20

// Function to rotate an N x N matrix 90 degrees clockwise in-place
void rotate_matrix(int n, int matrix[MAX_N][MAX_N]) {
    // TODO: Step 1 - Transpose matrix (swap matrix[i][j] with matrix[j][i] for i < j)

    // TODO: Step 2 - Reverse each row (swap matrix[i][j] with matrix[i][n - 1 - j])
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_N) {
        return 1;
    }

    int matrix[MAX_N][MAX_N];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    rotate_matrix(n, matrix);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d%s", matrix[i][j], (j == n - 1) ? "" : " ");
        }
        printf("\n");
    }

    return 0;
}
Abrir en el compilador
Solución y explicación

Intercambia matrix[i][j] y matrix[j][i] solo cuando i < j. La diagonal principal queda fija.

Luego intercambia las columnas j y N - 1 - j de cada fila hasta llegar al centro. La composición transforma (fila, columna) en (columna, N - 1 - fila), que es el giro horario.

Ambas fases requieren O(N²) de tiempo total y solo una variable temporal para cada intercambio.

Código de la solución

#include <stdio.h>

#define MAX_N 20

void rotate_matrix(int n, int matrix[MAX_N][MAX_N]) {
    // Step 1: Transpose matrix
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }

    // Step 2: Reverse each row
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n / 2; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[i][n - 1 - j];
            matrix[i][n - 1 - j] = temp;
        }
    }
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_N) {
        return 1;
    }

    int matrix[MAX_N][MAX_N];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    rotate_matrix(n, matrix);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d%s", matrix[i][j], (j == n - 1) ? "" : " ");
        }
        printf("\n");
    }

    return 0;
}

Preguntas frecuentes

¿Por qué el código y la salida siguen en inglés?

Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.