Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2017, 21:12   #1
MiT_73
Новичок
Джуниор
 
Регистрация: 21.12.2017
Сообщений: 2
Восклицание Как повернуть матрицу на одну позицию по часовой стрелке?

Задача:
Поворот матрицы. Сдвинуть элементы заданной матрицы в пределах периметра каждых вложенных подматриц на одну позицию по часовой стрелке. Матрица N*M
Вопрос:
Как это сделать? Именно поворот на одну позицию, а также не забыть про подматрицу.

Разъяснение условия

Код:
Пример (N=3; M=4):
0| 1 | 2 | 3 | 4 
=|================
1| 1   2   3   4  
2| 5   6   7   8  
3| 9   10  11  12

Результат (Как видите 6 и 7 поменяли свое местоположение в своей подматрице, так как матрица 3х4):
0| 1 | 2 | 3 | 4 
=|================
1| 5   1   2   3  
2| 9   7*  6*  4  
3| 10  11  12  8

Пример №2 (N=4; M=4):
0| 1 | 2 | 3 | 4 
=|================
1| 1   2   3   4  
2| 5   6   7   8  
3| 9   10  11  12
4| 13  14  15  16

Результат №2 (Как видите 6, 7, 10, 11 тоже повернулись на один элемент вправо):
0| 1 | 2 | 3 | 4 
=|================
1| 5   1   2   3  
2| 9   10* 6*  4  
3| 13  11* 7*  8
4| 14  15  16  12

"Цифра"* для пояснения


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

Мой код для обдумывания:
Код:
int main() {
int i, j;
int N;

cout << "Введите размеры матрицы:" << endl;
cout << "N = ";
cin >> N;
cout << "Матрица размером: " << N << "x" << N << endl;
//ДА, я знаю что матрица у меня N на N. Позже она станет размером N на M

int o = N * N;
int k = 0, mas[o];

int **A = new int *[N];
for (i = 0; i < N; i++) {
    A[i] = new int[N];
}

int **B = new int *[N];
for (i = 0; i < N; i++) {
    B[i] = new int[N];
}
cout << "Введите матрицу:" << endl;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
        cin >> A[i][j];
    }
}
cout << "Матрица до поворота:" << endl;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
        B[i][j] = A[i][j];
        cout << B[i][j] << " ";
    }
    cout << endl;
}
//Тут и нужно сделать поворот матрицы
/*Test*/

/*Test*/

cout << "Матрица после поворота:" << endl;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
        cout << B[i][j] << " ";
    }
    cout << endl;
}
for (i = 0; i < N; i++) {
    delete[] A[i];
    delete[] B[i];
}
system("pause");
return 0;
}
MiT_73 вне форума Ответить с цитированием
Старый 22.12.2017, 12:33   #2
MiT_73
Новичок
Джуниор
 
Регистрация: 21.12.2017
Сообщений: 2
По умолчанию

Сделал на Си
Код:
#include <stdio.h>
#define N	3
#define M	5
 
void swap(int * a, int * b)
{
  const int temp = *b;
  *b = *a;
  *a = temp;
}
void printarray(int * B)
{
  for(int i = 0; i < N; ++i)
  {
  	for(int j = 0; j < M; ++j, ++B)
  		printf("%d\t", *B);
  	printf("\n");
  }
}
int main(void) {
  int B[N][M];
  int i, j;
  // заполняем массив начальными значениями и выводим на экран
  for(i = 0; i < N; ++i)
  	for(j = 0; j < M; ++j)
  		B[i][j] = i * M + j + 1;
  printf("Начальный массив:\n");
  printarray(& B[0][0]);
 
  int beginrow, begincol, endrow, endcol;
  int i1;
  beginrow = 0;
  begincol = 0;
  endrow = N;
  endcol = M;
  for(i = 0; i < N / 2; ++i)
  {
  	// для промежуточного хранения при обмене используется первый элемент подматрицы
  	// двигаем первую строку
  	i1 = beginrow;
  	for(j = begincol + 1; j < endcol; ++j)
  		swap(& B[beginrow][begincol], & B[i1][j]);
  	// двигаем последний столбец без первой и последней строк
  	j = endcol - 1;
  	for(i1 = beginrow + 1; i1 < (endrow - 1); ++i1)
  		swap(& B[beginrow][begincol], & B[i1][j]);
	// двигаем последнюю строку в обратном порядке
  	i1 = endrow - 1;
  	for(j = endcol - 1; j >= begincol ; --j)
  		swap(& B[beginrow][begincol], & B[i1][j]);
  	// двигаем первый столбей в обратном порядке, кроме первой и последней строки
  	j = begincol;
  	for(i1 = endrow - 2; i1 > beginrow; --i1)
  		swap(& B[beginrow][begincol], & B[i1][j]);
 
	++beginrow;
	++begincol;
	--endrow;
	--endcol;
  }
  if(N % 2)
  {
  	// Для нечетных N нужно дополнительно двинуть средний вектор
  	i1 = beginrow;
  	for(j = begincol + 1; j < endcol; ++j)
		swap(& B[beginrow][begincol], & B[i1][j]);
  }
 
  printf("Результат\n");
  printarray(& B[0][0]);
  return 0;
}
MiT_73 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать матрицу 7х7 элементов. Вывести ее на экран, развернув на 90 градусов по часовой стрелке (Delphi) Kolya23 Помощь студентам 6 30.05.2015 14:15
Сортировать точки по часовой стрелке DarkHacker Общие вопросы Delphi 2 24.01.2015 15:35
Поворот матрицы по/против часовой стрелке Murashov Общие вопросы C/C++ 2 05.12.2012 19:57
повернуть квадратную матрицу на 90 градусов по часовой стрелке brans Общие вопросы по Java, Java SE, Kotlin 1 18.02.2011 19:42
Как перевернуть изображение по часовой стрелке John_chek Мультимедиа в Delphi 7 09.07.2007 00:24