Поворот матрицы на одну позицию по часовой стрелке (C++)

253
17 декабря 2017, 10:41

Задача:

Поворот матрицы. Сдвинуть элементы заданной матрицы в пределах периметра каждых вложенных подматриц на одну позицию по часовой стрелке. Матрица 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   6*  7*  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
"Цифра"* для пояснения

Вот мой код(я пытался делать через одномерный массив):

#include <iostream>
using namespace std;
int main() {
int i, j;
int N;
cout << "Введите размеры матрицы:" << endl;
cout << "N = ";
cin >> N;
cout << "Матрица размером: " << N << "x" << N << endl;
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*/
cout << "Одномерная матрица:" << endl;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
        mas[k++] = B[i][j];
    }
}
for (k = 0; k < o; k++) {
    cout << mas[k] << " ";
}
cout << endl;
cout << "Сортировка:" << endl;
for (k = 0; k < o - 1; k++) {
    int temp = mas[k];
    mas[k] = mas[k + 1];
    mas[k + 1] = temp;
}
for (k = 0; k < o; k++) {
    cout << mas[k] << " ";
}
cout << endl;
k = 0;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
        B[i][j] = mas[k++];
    }
}
/*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;
}
READ ALSO
Не могу найти mstest и testcomplite в гугл [требует правки]

Не могу найти mstest и testcomplite в гугл [требует правки]

где найти mstest и testcomplite? можно может у кого есть ссылка на офсайт?

147
объявление переменных

объявление переменных

можно ли объявить переменную, указав тип через консоль?

177
Исключение в ucrtbased.dll и callback

Исключение в ucrtbased.dll и callback

В Windows 10 что-то не так, ucrtbaseddll плюется исключениями:

209
Зачем нужен спецификатор PRIVATE в C++

Зачем нужен спецификатор PRIVATE в C++

Зачем нужен спецификатор private в C++, если по умолчанию итак все функции и переменные являются закрытыми?

268