Deutsche Lernausgabe
Matrix in C im Uhrzeigersinn drehen
Transponieren Sie eine quadratische Matrix und kehren Sie ihre Zeilen für eine Drehung direkt im Speicher um.

Lesen Sie eine N × N-Matrix ein und verändern Sie ihre Elemente direkt für eine Drehung im Uhrzeigersinn. Jedes Element an Position (Zeile, Spalte) wandert nach (Spalte, N - 1 - Zeile).
Die Aufgabe verlangt eine Umformung direkt im vorhandenen Speicher. Eine temporäre Variable zum Tauschen zweier Werte ist zulässig; eine zweite N × N-Matrix verletzt diese Vorgabe.
Eingabe
N, danach N Zeilen mit jeweils N Ganzzahlen.
Ausgabe
Die gedrehte Matrix: N Zeilen mit durch Leerzeichen getrennten Werten.
Vorgaben
- 1 ≤ N ≤ 20; Werte zwischen -1000 und 1000.
- Laufzeit O(N²) und Zusatzspeicher O(1).
Hinweise
- Transponieren Sie die Matrix, indem Sie nur Elemente oberhalb der Diagonale tauschen.
- Beginnen Sie die innere Schleife bei j = i + 1, damit kein Tausch rückgängig gemacht wird.
- Kehren Sie anschließend jede Zeile mit zwei Indizes um.
Quellcode
#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;
}Im Compiler öffnenErklärung der Lösung
Tauschen Sie matrix[i][j] und matrix[j][i] für i < j. Die Diagonale bleibt unverändert und jedes Paar wird nur einmal besucht.
Tauschen Sie in jeder Zeile die äußeren Werte und bewegen Sie die Indizes nach innen. Transposition und anschließende Zeilenumkehr ergeben die gewünschte Drehung im Uhrzeigersinn.
Lösungscode
#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;
}Häufige Fragen
Warum bleiben Code und manche Ausgaben englisch?
C-Schlüsselwörter, Bezeichner, Programmkommentare und erwartete Ausgaben bleiben wie im Original, damit der Code ausführbar und die Tests konsistent bleiben. Erklärungen und Aufgabenstellungen sind übersetzt.