Edizione didattica italiana
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 compilatoreSpiegazione 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.