#19269. 图像的原地旋转(LeetCode48)

图像的原地旋转(LeetCode48)

https://leetcode.cn/problems/rotate-image

LeetCode 48 "Rotate Image" 是一道非常经典的二维数组操作题目。原题强调“原地(In-place)”旋转,这在面试中是为了考察空间复杂度优化。

在 OI 竞赛中,通常我们关注输入输出的正确性,但为了保留这道题的精髓(同时也是为了训练大家对二维坐标变换的敏感度),我将其改写为标准的 OI 题目格式,并提供原地旋转的解法代码。


OI 习题:图像旋转 (Rotate Image)

【题目描述】

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

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。虽然在竞赛中我们只检查最终输出,但建议尝试不使用另一个 N×NN \times N 的辅助矩阵来解决这个问题,以锻炼对数组下标的控制能力。

旋转规则示例:

  • 原位置 (i,j)(i, j) 的元素,旋转 90 度后应该出现在位置 (j,N1i)(j, N-1-i)

【输入格式】

第一行包含一个整数 NN,表示矩阵的大小。 接下来 NN 行,每行包含 NN 个整数,表示矩阵中的元素。

【输出格式】

输出 NN 行,每行 NN 个整数,表示旋转后的矩阵。 数字之间用空格分隔。

【样例输入 1】

3
1 2 3
4 5 6
7 8 9

【样例输出 1】

7 4 1
8 5 2
9 6 3

【样例输入 2】

4
5 1 9 11
2 4 8 10
13 3 6 7
15 14 12 16

【样例输出 2】

15 13 2 5
14 3 4 1
12 6 8 9
16 7 10 11

【数据范围】

  • 1N10001 \le N \le 1000
  • 1000matrix[i][j]1000-1000 \le \text{matrix}[i][j] \le 1000

【解题思路提示】

要在原地将矩阵顺时针旋转 90 度,有一个非常经典的数学技巧,分为两步:

  1. 转置 (Transpose):将矩阵沿主对角线翻转。
    • 即:swap(matrix[i][j], matrix[j][i])
    • 效果:行变成了列。
  2. 翻转行 (Reverse Rows):将每一行内部进行左右翻转。
    • 即:reverse(matrix[i].begin(), matrix[i].end())

为什么这样有效?

  • 原始:第一行是 1 2 3
  • 转置后:第一列变成 1 2 3
  • 翻转行后:第一列的 1 跑到了最后一列的开头。这正是顺时针旋转的效果(原左上角的元素,跑到了右上角)。

【参考代码 (C++14 OI Style)】

见题解