将正方形矩阵顺时针旋转90度

it2024-07-14  41

将正方形矩阵顺时针旋转90度

题目描述

给定一个n*n的矩阵matrix,请把这个矩阵顺时针转动90度。

输入描述:

输入包含多行,第一行一个整数 n ( 1 ≤ n ≤ 200 ) n(1 \leq n \leq 200) n(1n200),代表矩阵的行数和列数,接下来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(1matrix[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; }
最新回复(0)