Online C Compiler
Im Compiler öffnen

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.

Im Compiler öffnen

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 öffnen
Erklä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.