Как повернуть матрицу на 90 градусов c

от admin

Как повернуть матрицу на 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 9

Output: 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 16

Moving 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.

Как я сказал в начале, здесь я собрал частичку того, чего не хватало мне при изучении программирования. Как бы эти вещи не казались бесполезными, все студенты университетов, изучающие информационные технологии проходят через это, и не напрасно — это помогает развивать логику и решать более сложные задачи, которые ждут далее. Приведенные выше примеры показывают некоторые важные способы взаимодействия с массивами.

Я надеюсь этот пост будет полезен, и если это будет так, то я напишу продолжение этой темы.

Похожие статьи