Edição didática em português. O código e suas saídas preservam o original.
Rotação de uma matriz em 90 graus
Gire uma matriz quadrada 90 graus no sentido horário sem criar uma segunda matriz.

Leia N e uma matriz de N × N inteiros. Modifique a própria matriz e mostre o resultado da rotação horária. Use O(1) de memória auxiliar: não reserve outra matriz para o resultado.
Uma forma de resolver consiste em transpor a matriz e depois inverter a ordem dos elementos de cada linha. Para uma matriz com uma única célula, o resultado não muda.
Entrada
Primeira linha: N. As próximas N linhas contêm N inteiros separados por espaços.
Saída
N linhas da matriz girada, com valores separados por espaços.
Restrições
- 1 <= N <= 20
- -1000 <= matrix[i][j] <= 1000
- O(1) de memória auxiliar.
Dicas
- Na transposição, comece com j = i + 1 para não trocar duas vezes.
- Inverta cada linha com dois índices que se aproximam a partir das extremidades.
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 no compiladorSolução e explicação
Troque matrix[i][j] e matrix[j][i] somente quando i < j. A diagonal principal permanece fixa.
Depois troque as colunas j e N - 1 - j de cada linha até chegar ao centro. A composição transforma (linha, coluna) em (coluna, N - 1 - linha), que é a rotação horária.
As duas fases exigem tempo total O(N²) e apenas uma variável temporária por troca.
Código da solução
#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;
}Perguntas frequentes
Por que o código e a saída continuam em inglês?
Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.