Рассмотрим алгоритм поворота матрицы на 90 градусов по часовой стрелке и против часовой стрелки. Этот алгоритм похож на транспонирование матрицы с тем отличием, что здесь для каждой точки одна из координат отображается зеркально.
// транспонирование матрицы — строки и колонки меняются местами
swapped[j][i] = matrix[i][j];
// по часовой стрелке ↻ — строки отображаются зеркально
rotated[j][i] = matrix[m-i-1][j];
// против часовой стрелки ↺ — колонки отображаются зеркально
rotated[j][i] = matrix[i][n-j-1];
Похожий алгоритм: Поворот матрицы на 180 градусов.
Напишем метод на Java для поворота матрицы {m×n
} на 90 градусов. Дополнительный параметр задаёт
направление поворота: по часовой стрелке или против часовой стрелки. Для примера возьмём
прямоугольную матрицу {4×3
}.
/**
* @param m количество строк исходной матрицы
* @param n количество колонок исходной матрицы
* @param clock направление поворота: по часовой
* стрелке ↻ или против часовой стрелки ↺
* @param matrix исходная матрица
* @return повёрнутая матрица
*/
public static int[][] rotateMatrix(int m, int n, boolean clock, int[][] matrix) {
// новая матрица, количества строк и колонок меняются местами
int[][] rotated = new int[n][m];
// обходим строки исходной матрицы
for (int i = 0; i < m; i++)
// обходим колонки исходной матрицы
for (int j = 0; j < n; j++)
if (clock) // поворот по часовой стрелке ↻
rotated[j][i] = matrix[m-i-1][j];
else // поворот против часовой стрелки ↺
rotated[j][i] = matrix[i][n-j-1];
return rotated;
}
// запускаем программу и выводим результат
public static void main(String[] args) {
// исходные данные
int m = 4, n = 3;
int[][] matrix = {{11, 12, 13}, {14, 15, 16}, {17, 18, 19}, {20, 21, 22}};
// поворачиваем матрицу и выводим результат
outputMatrix("Исходная матрица:", matrix);
outputMatrix("По часовой стрелке ↻:", rotateMatrix(m, n, true, matrix));
outputMatrix("Против часовой стрелки ↺:", rotateMatrix(m, n, false, matrix));
}
// вспомогательный метод, выводит матрицу в консоль построчно
public static void outputMatrix(String title, int[][] matrix) {
System.out.println(title);
for (int[] row : matrix) {
for (int el : row)
System.out.print(" " + el);
System.out.println();
}
}
Вывод:
Исходная матрица:
11 12 13
14 15 16
17 18 19
20 21 22
По часовой стрелке ↻:
20 17 14 11
21 18 15 12
22 19 16 13
Против часовой стрелки ↺:
13 16 19 22
12 15 18 21
11 14 17 20
© Головин Г.Г., Код с комментариями, 2021