C++如何实现将一个二维数组旋转90度
时间: 2025-07-06 16:36:05 浏览: 6
<think>好的,我现在需要解决用户的问题:如何用C++实现将二维数组旋转90度的方法,并提供示例代码。首先,我得回忆一下数组旋转的基本思路。
旋转二维数组通常有两种方式:顺时针90度或逆时针90度。用户没有特别说明方向,但常见的需求是顺时针旋转。首先,我得确定旋转后的数组结构。假设原数组是n×m的矩阵,顺时针旋转90度后应该是m×n的矩阵,因为行和列的维度会交换。例如,3x4的数组旋转后变成4x3,且每一列逆序成为行。
接下来,我需要考虑原地旋转还是使用额外空间。如果是方阵(n×n),原地旋转可能更高效,但用户的问题可能不限于方阵。对于非方阵的情况,必须创建新数组,因为行列数会变化。例如,3x4的数组旋转后变成4x3,所以必须分配新空间。
然后,如何确定元素的位置变换。顺时针旋转时,原矩阵的第i行会变成新矩阵的第(n-1-i)列。例如,原矩阵中元素的位置(i,j)旋转后变为(j, n-1-i)。不过这里要注意,原矩阵的行数和列数可能不同,所以需要重新计算新矩阵的行列数。例如,原矩阵是rows行cols列,旋转后的矩阵应该是cols行rows列。
现在,我需要考虑具体的实现步骤。假设用户需要一个函数,输入一个二维数组,返回旋转后的数组。在C++中,可以使用嵌套的vector来表示二维数组。步骤如下:
1. 确定原数组的行数和列数。
2. 创建新的二维数组,行数为原列数,列数为原行数。
3. 遍历原数组的每个元素,将其放置到新数组的对应位置。例如,原数组的(i,j)元素在新数组中应放在(j, rows-1 -i)的位置(顺时针旋转的情况)。
4. 返回新数组。
这里要注意索引是否正确,尤其是行和列的转换。例如,原数组的行从0到rows-1,列从0到cols-1。旋转后,新行数为cols,新列数为rows。因此,新数组的每个元素的位置由原数组的列j变成新行,原数组的行i变成新列,但需要逆序,所以rows-1 -i。
接下来,编写示例代码。例如,函数可能如下:
vector<vector<int>> rotate90Clockwise(vector<vector<int>>& matrix) {
int rows = matrix.size();
if (rows == 0) return {};
int cols = matrix[0].size();
vector<vector<int>> rotated(cols, vector<int>(rows));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
rotated[j][rows - 1 - i] = matrix[i][j];
}
}
return rotated;
}
测试这个函数,比如输入3x2的数组,旋转后应为2x3的数组,且元素正确放置。例如,原数组:
1 2
3 4
5 6
旋转后应变为:
5 3 1
6 4 2
这里,新数组的行是原数组的列数2,列是原行数3。每个元素的位置转换是否正确?
对于原数组的(0,0)=1,旋转后应放在新数组的(0,2)位置。原数组的(2,1)=6,旋转后应放在新数组的(1,0)位置。检查代码中的索引是否正确:对于原i=0到rows-1,j=0到cols-1,新数组的行是j,列是rows-1 -i。是的,这样转换正确。
用户可能遇到的常见问题包括索引错误,尤其是在处理非方阵时。此外,需要确保原数组每行的列数一致,否则会引发越界错误。在代码中,应该先检查原数组是否有效,比如每行的列数是否相同。
另外,如果是逆时针旋转90度,转换公式会不同。例如,原(i,j)可能变成(cols-1-j, i)。但用户的问题没有说明方向,所以可能需要明确处理顺时针的情况,并在注释中说明其他情况。
最后,提供完整的示例代码,包括主函数测试。例如:
#include <vector>
using namespace std;
vector<vector<int>> rotate90Clockwise(vector<vector<int>>& matrix) {
if (matrix.empty()) return {};
int rows = matrix.size();
int cols = matrix[0].size();
vector<vector<int>> rotated(cols, vector<int>(rows));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
rotated[j][rows - 1 - i] = matrix[i][j];
}
}
return rotated;
}
// 测试用例
int main() {
vector<vector<int>> arr = {{1,2}, {3,4}, {5,6}};
auto rotated = rotate90Clockwise(arr);
// 输出旋转后的数组
return 0;
}
这样应该能正确实现功能。用户可能还想知道原地旋转的方法,但如果是方阵,可以采用分层旋转的方法,每次旋转四个元素。但用户的问题可能更关注通用情况,所以当前回答可能更合适。</think>### C++实现二维数组旋转90度的方法
要实现二维数组顺时针旋转90度,核心思路是通过坐标变换重新排列元素。对于$m \times n$的矩阵,旋转后得到$n \times m$的新矩阵,其中原矩阵的第$i$行会变为新矩阵的第$n-1-i$列[^1]。
#### 算法步骤
1. **确定原矩阵维度**:假设原矩阵为$rows$行$cols$列
2. **创建新矩阵**:维度为$cols \times rows$
3. **坐标映射**:原矩阵元素$(i,j)$映射到新矩阵的$(j, rows-1-i)$位置
$$ \text{新矩阵}[j][rows-1-i] = \text{原矩阵}[i][j] $$
```cpp
#include <vector>
using namespace std;
vector<vector<int>> rotate90Clockwise(vector<vector<int>>& matrix) {
if (matrix.empty()) return {};
int rows = matrix.size();
int cols = matrix[0].size();
vector<vector<int>> rotated(cols, vector<int>(rows));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
rotated[j][rows - 1 - i] = matrix[i][j];
}
}
return rotated;
}
```
#### 示例分析
原矩阵:
```
1 2
3 4
5 6
```
旋转后:
```
5 3 1
6 4 2
```
#### 关键点说明
- **时间复杂度**:$O(m \times n)$,需要遍历所有元素
- **空间复杂度**:$O(m \times n)$,需要创建新矩阵
- **边界处理**:空矩阵检查、行列不匹配检测(代码中已包含空矩阵检查)
阅读全文
相关推荐






