任务:
矩阵旋转。在每个嵌套子矩阵的周长内将给定矩阵的元素顺时针移动一个位置。矩阵NxM
。
问: 怎么办?它是一个位置的旋转,也不要忘记子矩阵。
条件说明
Пример (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*/
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;
}
n x m
我们需要旋转的矩阵中“环”的数量是我们实现了一个迭代器,它将环号“视为”
r
元素的线性序列,从环的左上角元素开始逆时针进行(假设矩阵支持接口[i][j]
)现在,使用这样的迭代器,您可以简单地使用标准算法
std::rotate
依次旋转矩阵的所有环http://coliru.stacked-crooked.com/a/c5278f0ff20491d8
这里,是这样的(优化、简化、泛化的地方很多。比如直接从矩阵中取维数的初值\u200b\u200b。我就懒得...):
使用开始和结束索引调用,例如