Online C Compiler
Abrir no compilador

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.

Abrir no compilador

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 compilador
Soluçã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.