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.

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 compiladorSolució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.