Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/88: Рейтинг темы: голосов - 88, средняя оценка - 4.69
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508

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

09.12.2017, 11:23. Показов 19163. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Народ, нужна ваша помощь. Для реализации задачи необходима функция поворота матрицы на 90 градусов, причем матрица не всегда квадратная и в этом весь прикол. В интернете довольно много функций поворота матрицы n*n, а вот с прямоугольными напряженка. Напишите, пожалуйста, функцию для моего случая, задачу не могу продолжить дальше решать, пока нет этой функции...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2017, 11:23
Ответы с готовыми решениями:

Поворот матрицы на 90 градусов
Всем привет. Столкнулся с проблемой в задаче по повороту матрицы на 90 градусов. Код работал с матрицой 3х3 , потом решил с 9х9 и заполнить...

Поворот неквадратной матрицы на 90 градусов против часовой стрелки. Матрицы. Двумерный массив
Написать программу, выполняющую поворот неквадратной матрицы на 90° против часовой стрелки. Матрицы должны храниться в памяти в виде ...

Поворот динамической матрицы на 270 градусов
Массивы создаются в динамической области памяти с использованием операций NEW и DELETE. Ввод исходных данных: реальный размер массивов и их...

11
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,914
09.12.2017, 11:38
C
1
2
3
4
5
6
7
const int M = 2;
const int N = 3;
int src[M][N];
int dst[N][M];
for(int i=0; i<N; i++)
  for(int j=0; j<M; j++)
    dst[i][j] = src[j][M-i-1];
0
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508
09.12.2017, 11:48  [ТС]
А без вспомогательной матрицы данную задачу никак решить нельзя?
И еще такой вопрос, смогу ли я при помощи данной процедуры крутить матрицу 4 раза? Т.е. чтобы было так:

Изначальная матрица:
100
011

90 градусов по часовой стрелке:
01
10
10

Еще 90 градусов:
110
001

Еще 90:
01
01
10

И переход в изначальное состояние.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.12.2017, 11:48
COKPOWEHEU, у вас при i=N-1 последний индекс интересный получается....
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,914
09.12.2017, 12:04
Цитата Сообщение от Байт Посмотреть сообщение
COKPOWEHEU, у вас при i=N-1 последний индекс интересный получается....
да, конечно, там N-i-1
Цитата Сообщение от Imperion Посмотреть сообщение
А без вспомогательной матрицы данную задачу никак решить нельзя?
А как вы себе представляете вместить массив 2x3 в массив 3х2? Нет, с динамическим массивом это возможно, но в задаче-то их нет.
Цитата Сообщение от Imperion Посмотреть сообщение
И еще такой вопрос, смогу ли я при помощи данной процедуры крутить матрицу 4 раза? Т.е. чтобы было так:
Проверьте. Я свой код не проверял, как и обнаружил Байт.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.12.2017, 12:05
Цитата Сообщение от Imperion Посмотреть сообщение
А без вспомогательной матрицы данную задачу никак решить нельзя?
Для этого следует матрицу представить в виде линейного массива a[N*M]
Тогда исходный массив 1 2 3 4 5 6 переходит 4 1 5 2 6 3
Циклы 1->4->2->1, 3->5->6->3
Надо поймать, на какие циклы перестановка разлагается в общем случае.
Может быть имеет смысл обратиться к специалистам-алгебраистам?
Но сначала попробовать поймать закономерность на малых размерностях...

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А как вы себе представляете вместить массив 2x3 в массив 3х2
Легко Впрочем, я уже сказал...
0
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508
09.12.2017, 12:20  [ТС]
Можно кодом, пожалуйста? Я видел алгоритмы решения задачи, но как это реализовывать я не особо понимаю, поэтому и пишу сюда.
Даже если с одной матрицей сделать сложно, то пусть оно будет со вспомогательной, это не беда, я спросил чисто из интереса.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.12.2017, 12:36
Цитата Сообщение от Imperion Посмотреть сообщение
Я видел алгоритмы решения задачи,
А вот это и нам было бы интересно посмотреть...
0
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508
09.12.2017, 12:54  [ТС]
В программе COKPOWEHEU опять же что то не совсем так работает.
Плюс я не понял, где вы нашли индекс i=N-1 и его же поправили.

Добавлено через 17 минут
Алгоритм уже найти не могу, это неделю назад было, но нашел программу. Однако уж дюже она замороченная, поэтому, если не сложно, подправьте прогу COKPOWEHEU, пожалуйста.

То что нашел:

C++
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
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int** rotate_90(int **m_in, int *n, int *m)
{
    int **m_out;
    m_out=new int*[*n];
    for(int j=0; j<*n; j++)
     m_out[j]=new int[*m];
    for (int j=*m-1; j>=0; j--)
     for (int i=0; i<*n; i++)
        *(*(m_out+i)+*m-1-j)=*(*(m_in+j)+i);
    
    int buf=*n;
    *n=*m;
    *m=buf;
    return m_out;
}
 
int main()
{
int m;
int n;
cout<<"Enter size of matrix NxM: "<<endl;
cout<<"N="; cin>>n;
cout<<"M="; cin>>m;
cout<<endl;
 
int **matrix;              //Заполнение матрицы
matrix=new int*[m];
for(int j=0; j<m; j++)
 matrix[j]=new int[n];
 
cout<<"Before spin: "<<endl;    //Вывод матрицы до поворота
for(int i=0; i<n; i++)
{
    for(int j=0; j<m; j++)
    {
         *(*(matrix+j)+i)=rand()%10;
        cout<<*(*(matrix+j)+i)<<"; ";
    }
    cout<<endl;
}
 
 
int **matrix1=rotate_90(matrix, &n, &m);   //Поворот матрицы
cout<<"After spin: "<<endl;              //Вывод матрицы после поворота
for(int i=0; i<n; i++)       
{
    for(int j=0; j<m; j++)
    {
        cout<<*(*(matrix1+j)+i)<<"; ";
    }
    cout<<endl;
}
 
 
 
    return 0;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,914
09.12.2017, 13:02
Цитата Сообщение от Байт Посмотреть сообщение
Легко Впрочем, я уже сказал...
это не массив 2x3, а его линейное представление. В данном случае это важно.
Цитата Сообщение от Imperion Посмотреть сообщение
В программе COKPOWEHEU опять же что то не совсем так работает.
Что именно не работает? У меня работает нормально
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define M 2
#define N 3
 
int main(){
  int src[M][N] = {{1,2,3},{4,5,6}};
  int dst[N][M];
  int i,j;
  for(i=0; i<N; i++)
    for(j=0; j<M; j++)
      dst[i][j] = src[j][N-i-1];
  for(j=0; j<N; j++){
    for(i=0;i<M; i++)printf("%i\t", src[i][j]);
    printf("\n");
  }
  printf("-------------\n");
  for(j=0; j<M; j++){
    for(i=0;i<N; i++)printf("%i\t", dst[i][j]);
    printf("\n");
  }
}

Code
1
2
3
4
5
6
7
$ ./a.out 
1       4
2       5
3       6
-------------
3       2       1
6       5       4
Добавлено через 2 минуты
Цитата Сообщение от Imperion Посмотреть сообщение
*(*(m_out+i)+*m-1-j)=*(*(m_in+j)+i);
ужас. Хороший пример как делать НЕ надо: это просто обращение к m_in[j][i]. Зачем оно записано настолько вырвиглазно никто не знает.
Цитата Сообщение от Imperion Посмотреть сообщение
int **matrix; //Заполнение матрицы
matrix=new int*[m];
for(int j=0; j<m; j++)
matrix[j]=new int[n];
Тоже ужас, хотя и распространенный, к сожалению. И почему народ так любит многоуровневые вложенные массивы с ручным созданием-удалением вместо простого одномерного представления?
0
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508
09.12.2017, 13:02  [ТС]
Вот, поглядите.

Ну вот я и говорю, капец, а не код, который я скинул, его бы упростить и было бы счастье. А точнее, прописать все по-человечески.
Миниатюры
Поворот матрицы m*n на 90 градусов  
0
-44 / 2 / 3
Регистрация: 22.12.2015
Сообщений: 508
09.12.2017, 15:00  [ТС]
Блин, это я ошибся, спасибо большое за помощь!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2017, 15:00
Помогаю со студенческими работами здесь

Поворот матрицы на 90 градусов относительно центра
Как реализовать это в с++? И размерность матрицы задается пользователем (если да, то как?) или сразу же прописывается в программе (хотя в...

Поворот матрицы на 180 градусов по часовой стрелке
Нужна программа,которая повернет квадратную матрицу из N строк и N столбцов на 180 по часовой. программа на С++ За ранее благодарю:)

Поворот матрицы на 90*K градусов
Здравствуйте! Столкнулся с задачей поворота матрицы на 90*К градусов, где К - целое число. Перечитал все темы по повороту, но нигде...

Поворот матрицы на 90 градусов
uses crt; const l=100; var A:array of integer; i,j,p,x,k, n: integer; begin randomize; clrscr; writeln('vvedite razmer...

Поворот матрицы на 90 градусов
1.Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните поворот на 90...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru