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.

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 kompilerSolusi 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.