Online C Compiler
Buka di kompiler

Edisi pembelajaran bahasa Indonesia. Kode dan keluarannya tetap seperti aslinya.

Rotasi matriks 90 derajat

Putar matriks persegi 90 derajat searah jarum jam tanpa matriks kedua.

Buka di kompiler

Rotasi matriks 90 derajat
Putar matriks persegi 90 derajat searah jarum jam tanpa matriks kedua.

Baca N dan matriks N × N bilangan bulat. Ubah matriks asli lalu cetak hasil rotasinya. Memori tambahan harus O(1): jangan alokasikan array kedua untuk hasilnya.

Salah satu cara adalah mentransposisi matriks lalu membalik elemen setiap baris. Untuk matriks satu sel, hasilnya sama dengan masukan.

Masukan

Baris pertama: N. Berikutnya N baris, masing-masing berisi N integer yang dipisahkan spasi.

Keluaran

N baris matriks hasil rotasi dengan nilai dipisahkan spasi.

Batasan

  • 1 <= N <= 20
  • -1000 <= matrix[i][j] <= 1000
  • Memori tambahan O(1).
Petunjuk
  • Saat transposisi, mulai dari j = i + 1 agar tidak menukar dua kali.
  • Balik setiap baris memakai dua indeks yang bergerak saling mendekat.

Kode C

#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;
}
Buka di kompiler
Solusi dan penjelasan

Tukar matrix[i][j] dan matrix[j][i] hanya saat i < j. Diagonal utama tetap di tempatnya.

Kemudian tukar kolom j dan N - 1 - j pada setiap baris hingga mencapai tengah. Gabungan operasi memetakan (baris, kolom) menjadi (kolom, N - 1 - baris), yaitu rotasi searah jarum jam.

Kedua tahap membutuhkan waktu total O(N²). Setiap pertukaran cukup menggunakan satu variabel sementara.

Kode solusi

#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;
}

Pertanyaan umum

Mengapa kode dan keluarannya tetap dalam bahasa Inggris?

Kata kunci, pengenal, dan teks yang diperiksa tes dipertahankan agar program tidak berubah. Penjelasan dan kontrol telah diterjemahkan.