48. 旋转图像

51 阅读1分钟

48. 旋转图像

中等

相关标签

premium lock icon相关企业

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

 

示例 1:

输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

 

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

题解:

看答案旋转90°就是左右对称一次再对角线对称一次,这两个分别写成函数比较容易,搞清楚对称坐标的关系即可。

#include <stdio.h>
#include <stdlib.h>

void leftright(int** matrix, int n)
{
    int r, c, temp;
    for (r = 0;r <= n - 1;r ++)
    {
        c = 0;
        while (c <= n / 2 - 1)
        {
            temp = matrix[r][c];
            matrix[r][c] = matrix[r][n - 1 - c];
            matrix[r][n - 1 - c] = temp;
            c ++;
        }
    }
}

void xie(int** matrix, int n)
{
    int r, c, temp;
    for (r = 0;r <= n - 2;r ++)
    {
        c = 0;
        while (c <= n - 2 - r)
        {
            temp = matrix[r][c];
            matrix[r][c] = matrix[n - 1 - c][n - 1 - r];
            matrix[n - 1 - c][n - 1 - r] = temp;
            c ++;
        }
    }
}

int main()
{
    int n, i, j;
    scanf("%d", &n);
    int** matrix = (int**)malloc(sizeof(int*) * n);
    for (i = 0;i <= n - 1;i ++)
    {
        matrix[i] = (int*)malloc(sizeof(int) * n);
    }

    for (i = 0;i <= n - 1;i ++)
    {
        for (j = 0;j <= n - 1;j ++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }

    leftright(matrix, n);
    xie(matrix, n);
    for (i = 0;i <= n - 1;i ++)
    {
        for (j = 0;j <= n - 1;j ++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}