Online C Compiler
Apri nel compilatore

Edizione didattica italiana

Rotazione oraria di una matrice in C

Trasponi una matrice quadrata e inverti le righe per ruotarla sul posto.

Apri nel compilatore

Rotazione oraria di una matrice in C
Trasponi una matrice quadrata e inverti le righe per ruotarla sul posto.

Leggi una matrice N × N e modifica direttamente i suoi elementi. La posizione (riga, colonna) deve diventare (colonna, N - 1 - riga).

La trasformazione deve avvenire sul posto. Una variabile temporanea per lo scambio va bene; una seconda matrice N × N non rispetta il vincolo.

Input

N, seguito da N righe di N interi ciascuna.

Output

La matrice ruotata: N righe di valori separati da spazi.

Vincoli

  • 1 ≤ N ≤ 20; valori da -1000 a 1000.
  • Tempo O(N²) e memoria aggiuntiva O(1).
Suggerimenti
  • Trasponi scambiando soltanto gli elementi sopra la diagonale.
  • Inizia il ciclo interno da j = i + 1 per non annullare uno scambio.
  • Inverti poi ogni riga usando due indici.

Codice sorgente

#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;
}
Apri nel compilatore
Spiegazione della soluzione

Scambia matrix[i][j] e matrix[j][i] per i < j. La diagonale non cambia e ogni coppia viene visitata una volta.

In ogni riga scambia gli estremi e avvicina gli indici. La trasposizione seguita dall’inversione delle righe realizza la rotazione oraria.

Codice della soluzione

#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;
}

Domande frequenti

Perché il codice e alcuni risultati restano in inglese?

Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.