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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - 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