求一个矩阵旋转90度后的矩阵

求一个矩阵旋转了90度以后的矩阵谢谢啦
大概是100以内的范围就行

二、解题思路

难度:🔴🔴⚪⚪⚪

  • 对于初始矩阵:
  • $$\left[ \begin{matrix} 1 & 2 & 3\ 4 & 5 & 6\ 7 & 8 & 9 \end{matrix} \right]$$
  • 顺时针旋转 90 度的结果为:
  • $$\left[ \begin{matrix} 7 & 4 & 1\ 8 & 5 & 2\ 9 & 6 & 3 \end{matrix} \right]$$
  • 旋转 180 度 相当于旋转两次 90 度;旋转 270 度相当于旋转三次 90 度;旋转 360 度相当于旋转 0次 90度。所以,旋转 90R 度 和 旋转 $90 \times (R \ mod \ 4)$ 度等价。
  • 那么,我们只需要考虑顺时针旋转一次的结果即可。
  • 简单画个图看一下,对于原本是 $i$ 行的元素,变成了 $n-1-i$ 列去了;

  • 而原本 $j$ 列的元素,变到了 $j$ 行去了;

  • 所以我们掌握了核心,也就是:
  • $$mat[i][j] \to mat[j][n-1-i] $$

三、代码详解

#include <stdio.h>
#define maxn 10
int mat[maxn][maxn];

void clockwiseRotate90(int n, int mat[maxn][maxn]) {
    int tmp[maxn][maxn];
    int i, j;
    for(i = 0; i < n; ++i) {
        for(j = 0; j < n; ++j) {
            tmp[j][n-1-i] = mat[i][j];               // (1)
        }
    }
    for(i = 0; i < n; ++i) {
        for(j = 0; j < n; ++j) {
            mat[i][j] = tmp[i][j];                   // (2)
        }
    }
}

int main() {
    int n, R;
    int i, j;
    while(scanf("%d", &n) != EOF) {
        for(i = 0; i < n; ++i) {
            for(j = 0; j < n; ++j) {
                scanf("%d", &mat[i][j]);
            }
        } 
        scanf("%d", &R);
        R %= 4;                                       // (3)
        for(i = 0; i < R; ++i) {
            clockwiseRotate90(n, mat);                // (4)
        }
        for(i = 0; i < n; ++i) {
            for(j = 0; j < n; ++j) {
                if(j) 
                    printf(" ");
                printf("%d", mat[i][j]);
            }
            printf("\n"); 
        } 
    }
    return 0;
} 
  • $(1)$ 矩阵旋转的核心语句;
  • $(2)$ 这里需要引入一个临时矩阵,不然会出现变量污染的情况;
  • $(3)$ 旋转一次 90 度,360 度 为一个周期,所以需要对 4 取模;
  • $(4)$ 执行 R 次旋转 90 度的操作;