将正方形矩阵顺时针转动90°
Posted 三十年后的我
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将正方形矩阵顺时针转动90°相关的知识,希望对你有一定的参考价值。
给定一个 N×N 的矩阵 matrix,把这个矩阵调整成顺时针转动 90°后的形式。例如:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 14 15 16 顺时针转动 90°后为: |
13 |
9 |
5 |
1 |
14 |
10 |
6 |
2 |
15 |
11 |
7 |
3 |
16 |
12 |
8 |
4 |
这里仍使用分圈处理的方式,在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC) 就可以表示一个子矩阵。比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。
1 |
2 |
3 |
4 |
5 |
|
|
8 |
9 |
|
|
12 |
13 |
14 |
15 |
16 |
在这个外圈中,1,4,16,13 为一组,然后让 1 占据 4 的位置,4 占据 16 的位置,16 占据 13 的位置,13 占据 1 的位置,一组就调整完了。然后 2,8,15,9 为一组,继续占据调整的过程,最后 3,12,14,5 为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、
(dR,dC)=(3,3)的子矩阵外层就调整完毕。接下来令 tR 和 tC 加 1,即(tR,tC)=(1,1),令 dR 和
dC 减 1,即(dR,dC)=(2,2),此时表示的子矩阵如下。
6 |
7 |
10 |
11 |
这个外层只有一组,就是 6,7,11,10,占据调整之后即可。所以,如果子矩阵的大小是 M×M,一共就有 M-1 组,分别进行占据调整即可。
#include<iostream> using namespace std; void rotateEdge(int matrix[][4], int tR, int tC, int dR, int dC) { //总组数 int times = dC - tC; int temp = 0; for (int i = 0;i != times;++i) { temp = matrix[tR][tC + i]; matrix[tR][tC + i] = matrix[dR - i][tC]; matrix[dR - i][tC] = matrix[dR][dC - i]; matrix[dR][dC - i] = matrix[tR + i][dC]; matrix[tR + i][dC] = temp; } } void rotate(int matrix[][4], int rowCount, int colCount) { int tR = 0; int tC = 0; int dR = rowCount - 1; int dC = colCount - 1; while (tR < dR) rotateEdge(matrix, tR++, tC++, dR--, dC--); } int main() { int matrix[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; rotate(&matrix[0], 4, 4); for each (int var in matrix) { cout << var << " "; } cout << endl; system("pause"); }
以上是关于将正方形矩阵顺时针转动90°的主要内容,如果未能解决你的问题,请参考以下文章
《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90