将正方形矩阵顺时针旋转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;
}