📅  最后修改于: 2023-12-03 15:39:19.837000             🧑  作者: Mango
矩阵旋转指的是将矩阵按顺时针或逆时针方向旋转一定角度后得到新的矩阵。本文将介绍如何编写一个 C++ 程序将矩阵旋转 45 度。
我们可以将矩阵分成两部分,一部分是对角线及其上方的元素,另一部分是对角线下方的元素。然后对这两部分进行交换即可完成矩阵旋转。
具体实现过程如下:
matrix[i][j]
,根据对角线的位置来确定它在旋转后的位置。如果对角线在第 m
行第 n
列,那么旋转后 matrix[i][j]
会被移动到 matrix[m-j+i][n+i-j]
的位置。下面是将矩阵旋转 45 度的 C++ 程序实现。假设原始矩阵为 matrix
,行数为 m
,列数为 n
。这里采用了 STL 中的 vector 来实现矩阵,但理论上也适用于普通的二维数组。
#include <vector>
void rotateMatrix(std::vector<std::vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
// 先交换对角线两侧的元素
for (int i = 0; i < m; i++) {
for (int j = i + 1; j < n; j++) {
std::swap(matrix[i][j], matrix[j][i]);
}
}
// 再根据对角线的位置移动元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int ni = n - j + i - 1;
int nj = i + j - m + 1;
if (ni >= 0 && ni < m && nj >= 0 && nj < n) {
std::swap(matrix[i][j], matrix[ni][nj]);
}
}
}
// 如果行数和列数不相等,则需要交换行和列
if (m != n) {
std::vector<std::vector<int>> temp(n, std::vector<int>(m, 0));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
temp[j][i] = matrix[i][j];
}
}
matrix = temp;
}
}
下面是一个示例程序,展示了如何使用上面实现的函数来旋转一个矩阵。
#include <iostream>
#include <vector>
void rotateMatrix(std::vector<std::vector<int>>& matrix);
int main() {
// 测试数据
std::vector<std::vector<int>> matrix {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 输出原始矩阵
std::cout << "Original matrix:" << std::endl;
for (const auto& row : matrix) {
for (int x : row) {
std::cout << x << " ";
}
std::cout << std::endl;
}
// 旋转矩阵
rotateMatrix(matrix);
// 输出旋转后的矩阵
std::cout << "Rotated matrix:" << std::endl;
for (const auto& row : matrix) {
for (int x : row) {
std::cout << x << " ";
}
std::cout << std::endl;
}
return 0;
}
输出结果为:
Original matrix:
1 2 3
4 5 6
7 8 9
Rotated matrix:
7 4 1
8 5 2
9 6 3
本文介绍了如何编写一个 C++ 程序将矩阵旋转 45 度。实现思路是先交换对角线两侧的元素,然后根据对角线的位置移动元素。如果矩阵的行数和列数不相等,则需要交换行和列。这个算法的时间复杂度为 $O(n^2)$,其中 $n$ 是矩阵的大小。