Как повернуть матрицу на 90 градусов c
БлогNot. С++: поворот матрицы
С++: поворот матрицы
Любопытная задача — не транспонировать, а именно повернуть на 90, 180 или 270 градусов матрицу.
Если результаты перестановки писать в новую матрицу, задач тривиальна. Достаточно иметь функцию вращения матрицы на 90 градусов (например, по часовой стрелке), вызываемую нужное число раз. В примере квадратная матрица «вращается» четырежды, возвращаясь, в итоге, «на место». Для неквадратной матрицы изменятся лишь границы циклов и выделение памяти.
Вывод этой программы:
Вращение матрицы «на месте» осуществить посложнее, но тоже возможно. В этом случае задача имеет смысл лишь для квадратной матрицы (иначе будет задача 1, с выделением памяти под новую матрицу — ведь часть элементов могут попасть «в никуда»).
Напишем пару функций для вращения матрицы по и против часовой стрелки на 90 градусов:
Rotate M*N Matrix (90 degrees) [duplicate]
If your matrix is represented by an array matrix[i, j] , where the i are the rows and the j are the columns, then implement the following method:
This works for matrices of all sizes.
Edit: If this operation is too expensive, then one could try changing the way one reads the matrix instead of changing the matrix itself. For example, if I am displaying the matrix as follows:
then I could represent a 90-degree counterclockwise rotation by changing the way I read the matrix:
Как повернуть матрицу на 90 градусов c
Given a square matrix, turn it by 90 degrees in an anti-clockwise direction without using any extra space
Examples:
Input:
Matrix: 1 2 3
4 5 6
7 8 9Output: 3 6 9
2 5 8
1 4 7
Input:
Matrix: 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Output: 4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13
Note: An approach that requires extra space is already discussed here.
Example no1 – Inplace rotate square matrix by 90 degrees by forming cycles:
To solve the problem follow the below idea:
To solve the question without any extra space, rotate the array in form of squares, dividing the matrix into squares or cycles. For example,
A 4 X 4 matrix will have 2 cycles. The first cycle is formed by its 1st row, last column, last row, and 1st column. The second cycle is formed by the 2nd row, second-last column, second-last row, and 2nd column. The idea is for each square cycle, to swap the elements involved with the corresponding cell in the matrix in an anti-clockwise direction i.e. from top to left, left to bottom, bottom to right, and from right to top one at a time using nothing but a temporary variable to achieve this
Dry run of the above approach:
First Cycle:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16Moving first group of four elements (elements
of 1st row, last row, 1st column and last column) of first cycle
in counter clockwise.
4 2 3 16
5 6 7 8
9 10 11 12
1 14 15 13
Moving next group of four elements of
first cycle in counter clockwise
4 8 3 16
5 6 7 15
2 10 11 12
1 14 9 13
Moving final group of four elements of
first cycle in counter clockwise
4 8 12 16
3 6 7 15
2 10 11 14
1 5 9 13
Second Cycle:
4 8 12 16
3 6 7 15
2 10 11 14
1 5 9 13
Fixing second cycle
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13
Демонстративно вертим массивы для новичков
Массив — структура, стоявшая у истоков программирования. Но, несмотря на то, что массивам уделяется внимание в каждом курсе уроков по любому языку программирования, от новичков все равно ускользает много важной информации, связанной с логикой взаимодействия с этой структурой.
Цель этого поста — собрать некоторую информацию о массивах, которой когда-то не хватало мне. Пост для новичков.
Что такое массив?
Массив — это структура однотипных данных, расположенная в памяти одним неразрывным блоком.

Расположение одномерного массива в памяти
Многомерные массивы хранятся точно также.

Расположение двухмерного массива в памяти
Знание этого позволяет нам по-другому обращаться к элементам массива. Например, у нас есть двухмерный массив из 9 элементов 3х3. Так что есть, как минимум два способа вывести его правильно:
1-й вариант (Самый простой):
2-й вариант (Посложнее):
Формула для обращения к элементу 2-размерного массива, где width — ширина массива, col — нужный нам столбец, а row — нужная нам строчка:
Зная второй вариант, необязательно пользоваться им постоянно, но все же знать стоит. Например, он может быть полезен, когда нужно избавиться от лишних звездочек от указателей на указатели на указатели.
А вот так можно работать с трехмерным массивом
Этим способом можно обходить трехмерные объекты, например.
Формула доступа к элементам в трехмерном массиве, где height — высота массива, width — ширина массива, depth — глубина элемента(наше новое пространство), col — столбец элемента, а row — строка элемента:
Для получения доступа к элементам массива большей размерности по аналогии в формулу добавляем новые пространства.
Алгоритмы обработки массивов
Я не буду здесь писать про алгоритмы сортировки и алгоритмы поиска, так как найти код для почти любого из этих алгоритмов не составит труда.
Изображения — это целый комплекс из разных заголовков и информации о изображении, и самого изображения хранящемся в виде двухмерного массива.
Обработка изображений хорошо научит работать с двумерными массивами. Вот некоторые алгоритмы, которые пригодились мне для обработки изображений:
1) Зеркальное отражение.
Для того чтобы перевернуть изображение по горизонтали нужно всего лишь читать массив, в котором оно содержится сверху вниз и справа налево.
По такому же принципу выполняется переворот изображения по вертикали.
2) Поворот изображения на 90 градусов.
Для поворота изображения нужно повернуть сам двухмерный массив, а чтобы повернуть массив нужно транспонировать двухмерный массив, а затем зеркально отразить по горизонтали.

Пошаговое выполнение алгоритма
Такой алгоритм появился, когда я нарисовал график координат c точками.

График, приведший к решению
Хочу обратить ваше внимание, что здесь я применяю другой способ переворота изображения. Вместо выделения памяти под новый массив, здесь просто меняем местами первые и последние элементы.
Примечание: создать массив размерностью высоты и ширины реального изображения на стеке не выйдет. Только на куче с помощью оператора new.
Заключение
Этот небольшой пост не претендует на невероятные открытия мира информатики, но надеюсь успешно поможет немного вникнуть в устройство массивов падаванам мира IT.
Как я сказал в начале, здесь я собрал частичку того, чего не хватало мне при изучении программирования. Как бы эти вещи не казались бесполезными, все студенты университетов, изучающие информационные технологии проходят через это, и не напрасно — это помогает развивать логику и решать более сложные задачи, которые ждут далее. Приведенные выше примеры показывают некоторые важные способы взаимодействия с массивами.
Я надеюсь этот пост будет полезен, и если это будет так, то я напишу продолжение этой темы.