Online C Compiler
Открыть в компиляторе

Учебная версия на русском. Код и его вывод сохранены в исходном виде.

Поворот матрицы на 90 градусов

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

Открыть в компиляторе

Поворот матрицы на 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;
}

Частые вопросы

Почему код и вывод остаются на английском?

Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.