1. 矩阵旋转问题的背景与理解
最近在刷算法题时遇到了一个有趣的矩阵旋转问题,题目要求实现对一个二维矩阵中指定子矩阵的顺时针或逆时针90度旋转。这类问题在实际开发中其实有不少应用场景,比如图像处理中的局部旋转、游戏开发中的地图变换等。
题目描述可以这样理解:给定一个n×n的方阵,需要进行m次操作。每次操作会指定一个中心点(x,y)和半径r,形成一个(2r+1)×(2r+1)的子矩阵,然后根据参数z的值(0或1)决定是顺时针还是逆时针旋转这个子矩阵90度。
注意:这里的旋转半径r决定了子矩阵的大小。比如r=1时,子矩阵是3×3的;r=2时,子矩阵是5×5的,以此类推。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解决思路
2.1 矩阵的表示与初始化
在C++中,我们通常用二维数组来表示矩阵。题目中使用了两个全局数组arr和brr,大小都是501×501,这足够应付大多数算法题中的矩阵大小要求。
初始化部分很简单,就是按行优先顺序依次填充数字1到n²。这种初始化方式在调试时很有帮助,因为可以清楚地看到每个元素的位置变化。
cpp复制for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
arr[i][j] = k;
k++;
}
}
2.2 旋转操作的核心逻辑
旋转操作是本题的核心难点。我们需要理解如何将一个子矩阵旋转90度。这里的关键在于找到旋转前后坐标的对应关系。
对于顺时针旋转90度,坐标变换公式为:
code复制新x = 中心x - (原y - 中心y)
新y = 中心y + (原x - 中心x)
而对于逆时针旋转90度,坐标变换公式为:
code复制新x = 中心x + (原y - 中心y)
新y = 中心y - (原x - 中心x)
在代码中,这个变换是这样实现的:
cpp复制// 顺时针旋转
brr[x - (y - j)][y + (i - x)] = arr[i][j];
// 逆时针旋转
brr[x + (y - j)][y - (i - x)] = arr[i][j];
2.3 旋转操作的实现细节
实现旋转时需要注意几个关键点:
- 使用临时矩阵brr来
