Édition pédagogique en français
Rotation horaire d’une matrice en C
Transposez une matrice carrée puis inversez ses lignes pour la faire tourner sur place.

Lisez une matrice N × N et modifiez directement ses éléments pour effectuer une rotation horaire. Chaque élément de la position (ligne, colonne) rejoint la position (colonne, N - 1 - ligne).
L’exercice demande une transformation sur place. Une variable temporaire pour échanger deux valeurs convient ; une seconde matrice de taille N × N ne respecte pas cette contrainte.
Entrée
N, puis N lignes contenant chacune N entiers.
Sortie
La matrice tournée : N lignes de valeurs séparées par des espaces.
Contraintes
- 1 ≤ N ≤ 20 ; valeurs entre -1000 et 1000.
- Temps O(N²) et mémoire supplémentaire O(1).
Indices
- Transposez la matrice en échangeant seulement les éléments au-dessus de la diagonale.
- Commencez la boucle interne à j = i + 1 pour ne pas annuler un échange.
- Inversez ensuite chaque ligne à l’aide de deux indices.
Code source
#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;
}Ouvrir dans le compilateurExplication de la solution
Échangez matrix[i][j] et matrix[j][i] pour i < j. La diagonale reste inchangée et chaque paire est visitée une seule fois.
Dans chaque ligne, échangez les extrémités puis rapprochez les indices. La transposition suivie de cette inversion réalise la rotation horaire attendue.
Code de la solution
#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;
}Questions fréquentes
Pourquoi le code et certains résultats restent-ils en anglais ?
Les mots-clés C, les identifiants, les commentaires du programme et les sorties attendues restent ceux de la version originale pour conserver un code exécutable et des tests cohérents. Les explications et les consignes sont traduites.