将正方形矩阵顺时针旋转90度
题目描述
给定一个n*n的矩阵matrix,请把这个矩阵顺时针转动90度。
输入描述:
输入包含多行,第一行一个整数 n ( 1 ≤ n ≤ 200 ) n(1 \leq n \leq 200) n(1≤n≤200),代表矩阵的行数和列数,接下来n行,每行n个整数,代表矩阵 m a t r i x ( 1 ≤ m a t r i x [ i ] [ j ] ≤ 40000 ) matrix(1 \leq matrix[i][j] \leq 40000) matrix(1≤matrix[i][j]≤40000)。
输出描述:
输出旋转后的矩阵(包含n行,每行n个数)。
示例1
输入
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
备注:
额外空间复杂度 O ( 1 ) O(1) O(1)。
题解:
仍然分层处理,使用左上角和右下角两个点表示一个子矩阵。比如在样例中,左上角为(0,0),右下角为(3,3)就可以表示整个矩阵。其最外层如下:
1 2 3 4
5 8
9 12
13 14 15 16
在这层中,1,4,16,13为一组,依次互换位置,即调整完一组。然后是 2,8,15,9,等等。该层调整完成后,继续下一层调整,直到整个矩阵被处理完毕。
代码:
#include <cstdio>
using namespace std;
const int N = 200;
int n;
int a[N][N];
int main(void) {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
for( int j = 0; j < n; ++j)
scanf("%d", a[i] + j);
}
int tr = 0, tc = 0;
int dr = n - 1, dc = n - 1;
int tmp, num;
while (tr < dr) {
num = dc - tc; // 该层有多少组
for (int i = 0; i < num; ++i) {
tmp = a[tr][tc + i];
a[tr][tc + i] = a[dr - i][tc];
a[dr - i][tc] = a[dr][dc - i];
a[dr][dc - i] = a[tr + i][dc];
a[tr + i][dc] = tmp;
}
++tr, ++tc;
--dr, --dc;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j)
printf("%d%c", a[i][j], " \n"[j == n - 1]);
}
return 0;
}