Nederlandse leereditie
Een matrix rechtsom draaien in C
Transponeer een vierkante matrix en keer de rijen om voor een draaiing in het bestaande geheugen.

Lees een N × N-matrix en wijzig de elementen direct. Positie (rij, kolom) moet naar (kolom, N - 1 - rij) gaan.
De bewerking moet in het bestaande geheugen gebeuren. Een tijdelijke variabele om te wisselen mag; een tweede N × N-matrix voldoet niet aan de eis.
Invoer
N, gevolgd door N regels met elk N gehele getallen.
Uitvoer
De gedraaide matrix: N regels met door spaties gescheiden waarden.
Voorwaarden
- 1 ≤ N ≤ 20; waarden van -1000 tot 1000.
- Tijd O(N²) en extra geheugen O(1).
Hints
- Transponeer door alleen elementen boven de diagonaal te wisselen.
- Begin de binnenste lus bij j = i + 1 om een wissel niet terug te draaien.
- Keer daarna elke rij om met twee indices.
Broncode
#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;
}Openen in de compilerUitleg van de oplossing
Wissel matrix[i][j] en matrix[j][i] voor i < j. De diagonaal blijft gelijk en elk paar wordt één keer bezocht.
Wissel per rij de uiteinden en beweeg de indices naar elkaar toe. Transponeren gevolgd door rijomkering geeft de draaiing rechtsom.
Oplossingscode
#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;
}Veelgestelde vragen
Waarom blijven code en sommige resultaten Engels?
C-sleutelwoorden, namen, programmacommentaar en verwachte uitvoer blijven gelijk aan het origineel om uitvoerbare code en consistente tests te behouden. Uitleg en instructies zijn vertaald.