Online C Compiler
Openen in de compiler

Nederlandse leereditie

Een matrix rechtsom draaien in C

Transponeer een vierkante matrix en keer de rijen om voor een draaiing in het bestaande geheugen.

Openen in de compiler

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 compiler
Uitleg 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.