Поворот матрицы на 90 градусов против часовой стрелки
Уточните пожалуйста — у вас матрица это список списков, Numpy 2D array, Pandas DataFrame или что-то другое?
18 мар 2018 в 19:12
Простая, список списков
18 мар 2018 в 19:18
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
проще всего будет воспользоваться Numpy:
import numpy as np In [86]: l Out[86]: [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1]] In [87]: a = np.array(l) In [70]: a Out[70]: array([[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1]], dtype=int64)
In [71]: np.rot90(a) Out[71]: array([[0, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=int64)
можно несколько раз повернуть:
In [72]: np.rot90(a, k=2) Out[72]: array([[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0]], dtype=int64)
«вернуть» к обычному списку списков:
In [107]: np.rot90(a).tolist() Out[107]: [[0, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
без использования Numpy:
In [131]: list(zip(*lst))[::-1] Out[131]: [(0, 1, 1, 1), (0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)]
In [140]: a Out[140]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) In [141]: lst = a.tolist() In [142]: lst Out[142]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]] In [143]: np.rot90(a) Out[143]: array([[ 3, 7, 11, 15], [ 2, 6, 10, 14], [ 1, 5, 9, 13], [ 0, 4, 8, 12]]) In [144]: np.rot90(a).tolist() Out[144]: [[3, 7, 11, 15], [2, 6, 10, 14], [1, 5, 9, 13], [0, 4, 8, 12]] In [145]: list(zip(*lst))[::-1] Out[145]: [(3, 7, 11, 15), (2, 6, 10, 14), (1, 5, 9, 13), (0, 4, 8, 12)]
Повернуть квадратную матрицу на 90 градусов по часовой стрелке — C (СИ)
В данном коде на языке C происходит поворот квадратной матрицы на 90 градусов по часовой стрелке.
- Объявляется матрица matrix размером n на n и заполняется нулями и единицами.
- Выводится на экран исходная матрица с помощью двух вложенных циклов for.
- Поворот матрицы осуществляется с помощью двух вложенных циклов for, где внешний цикл идет по строкам (i), а внутренний по столбцам (j).
- Внутренний цикл начинается с n-1 и идет до 0, чтобы элементы выводились в обратном порядке.
- Возвращается 0, чтобы указать, что программа успешно завершилась.
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д
Как перевернуть матрицу на 90 градусов ?

Как сделать так, чтобы числа, заданные в квадратной матрице переместились на 90 градусов?
(Сам код я написать могу, мне нужна именно формула, при помощи которой числа будет перемещены на новые места)
Благодарю за отведенное на меня время.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Перевернуть матрицу на 90 градусов по часовой стрелке, а затем найти строку, сумма элементов которой наименьшая
Дана матрица размером М на Н,заполненная 0 и 1. Матрицу нужно перевернуть на 90 градусов по часовой.
Перевернуть строки на 90 градусов
Вам заданы несколько строчек текста (сначала количество строчек, потом сами строчки). Вам надо.
Заполнить матрицу случайными числами. Развернуть матрицу на 90(градусов) против часовой стрелки
Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки
Перевернуть матрицу по диагонали
Помогите пожалуйста. Задача: перевернуть матрицу по диагонали
![]()
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
D303, Имхо, это реализуется серией циклических сдвигов одномерных массивов. Так, для матрицы четного порядка это
1) циклический сдвиг элементов внутреннего квадрата (их 4) на 1
2) циклический сдвиг элементов объемлющего квадрата 4х4 (12 элементов, сдвиг на 3)
.. и так далее
Для нечетного порядка — аналогично
Сообщение от D303 
мне нужна именно формула
Формулы предложить не могу. Но алгоритмы таких сдвигов одномерных массивов есть. Они не совсем тривиальны, но многократно обсуждались на форуме. Один из изящных алгоритмов носит бандитское название «два кулака». Он не самый оптимальный, но — неплохой.
Если вам понятна идея сведения задачи к серии одномерных циклических сдвигов, будем искать дальше.
Не исключено, что для вашего «квадратного» случая есть и более оптимальные решения.
Заблокирован
вроде можно поворачивать «концентрические» квадраты/их периметры
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
Сообщение от Байт 
Имхо, это реализуется серией циклических сдвигов одномерных массивов
Чего? Циклических сдвигов? Сдвигов? Да еще и циклических?
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746

Сообщение было отмечено D303 как решение
Решение
Если матрица A — исходная, а B — результат, то формула будет такой (если верно понял задачу и нигде не накосячил):
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
Зачем нужна формула, когда можно пройтись по матрице в определённом порядке
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#include #include class Matrix { private: size_t mRows; size_t mCols; std::vectorint> mData; private: bool isValid(size_t i, size_t j) const { return (i >= 0) && (i mRows) && (j >= 0) && (j mCols); } public: ~Matrix() = default; Matrix(size_t rows, size_t cols) : mRows(rows), mCols(cols), mData(rows * cols) {} void fillRand(int low = 0, int up = 9) { for (int i = 0; i mRows; ++i) { for (int j = 0; j mCols; ++j) { mData[i * mCols + j] = (rand() % (up - low + 1)) - low; } } } void show() { for (int i = 0; i mRows; ++i) { for (int j = 0; j mCols; ++j) { std::cout [ i * mCols + j] <" "; } std::cout <'\n'; } std::cout <'\n'; } void rotateCW() { std::vectorint> rotated; for (int i = 0; i mCols; ++i) { for (int j = mRows - 1; j >= 0; --j) { rotated.push_back(mData[j * mCols + i]); } } mData = rotated; std::swap(mRows, mCols); } void rotateCCW() { std::vectorint> rotated; for (int i = mCols - 1; i >= 0; --i) { for (int j = 0; j mRows; ++j) { rotated.push_back(mData[j * mCols + i]); } } mData = rotated; std::swap(mRows, mCols); } }; int main() { Matrix mx(3, 5); mx.fillRand(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); system("pause"); return 0; };
MrMurder / MatrixRotation
Save MrMurder/4f2ff3353e246ec267303f8cc7f8f470 to your computer and use it in GitHub Desktop.
Повернуть матрицу на 90 (180, 270) градусов против часовой стрелки
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| public class MatrixRotation |
| static void createMatrix(int[][] a) |
| for (int i = 0; i < a.length; i++) |
| for (int j = 0; j < a.length; j++) |
| System.out.print(a[i][j] + » «); |
| > |
| System.out.println(); |
| > |
| System.out.println(); |
| > |
| static void rotateM270(int[][] a) |
| int[][] b = new int[a.length][a.length]; |
| for (int i = 0; i < b.length; i++) |
| for (int j = 0; j < b.length; j++) |
| b[i][j] = a[j][a.length — i — 1]; |
| > |
| > |
| System.out.println(«Rotating by 270 degree»); |
| createMatrix(b); |
| > |
| static void rotateM90(int[][] a) |
| int[][] b = new int[a.length][a.length]; |
| for (int i = 0; i < b.length; i++) |
| for (int j = 0; j < b.length; j++) |
| b[j][i] = a[a.length — i — 1][j]; |
| > |
| > |
| System.out.println(«This matrix is rotated by 90 degree:»); |
| createMatrix(b); |
| > |
| static void rotateM180(int[][] a) |
| int[][] b = new int[a.length][a.length]; |
| for (int i = 0; i < b.length; i++) |
| for (int j = 0; j < b.length; j++) |
| b[j][i] = a[a.length — j — 1][a.length — i — 1]; |
| > |
| > |
| System.out.println(«This matrix is rotated by 180 degree:»); |
| createMatrix(b); |
| > |
| public static void main(String[] args) |
| int[][] a = , , >; |
| System.out.println(«Original matrix:»); |
| createMatrix(a); |
| rotateM270(a); |
| rotateM90(a); |
| rotateM180(a); |
| > |
| > |