Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Поворот матрицы на 90 градусов
Поверните квадратную матрицу на 90 градусов по часовой стрелке без второй матрицы.

Прочитайте N и матрицу N × N целых чисел. Измените исходную матрицу и выведите результат поворота. Дополнительная память должна быть O(1): выделять второй массив для результата нельзя.
Один способ — транспонировать матрицу, а затем развернуть элементы каждой строки. Для матрицы из одной ячейки результат совпадает с исходным.
Ввод
Первая строка: N. Следующие N строк содержат по N целых через пробел.
Вывод
N строк повёрнутой матрицы с числами через пробел.
Ограничения
- 1 <= N <= 20
- -1000 <= matrix[i][j] <= 1000
- O(1) дополнительной памяти.
Подсказки
- При транспонировании начинайте с j = i + 1, чтобы не обменивать дважды.
- Разворачивайте строку двумя индексами, движущимися навстречу.
Код 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;
}Открыть в компилятореРешение и объяснение
Обменивайте matrix[i][j] и matrix[j][i] только при i < j. Главная диагональ остаётся на месте.
После этого меняйте в каждой строке столбцы j и N - 1 - j до середины. Совместно операции переводят (строка, столбец) в (столбец, N - 1 - строка), что и даёт поворот по часовой стрелке.
Обе фазы требуют суммарно O(N²) времени. Для каждого обмена достаточно одной временной переменной.
Код решения
#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;
}Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.