矩阵旋转
题目:使用C++,原地90℃旋转一个M*N的矩阵,不允许增加任何内存空间(空间复杂度为O(1))
分析:
1、使用一个函数rotateMatrix
,这个函数通过对矩阵进行转置和中心对称交换,实现了将矩阵顺时针旋转90度。
1 2 3 -> 1 4 7 -> 7 4 1
4 5 6 -> 2 5 8 -> 8 5 2
7 8 9 -> 3 6 9 -> 9 6 3
2、使用了一个函数printMatrix
,该函数用于打印一个二维数组(矩阵)。函数接受三个参数:一个二维整数数组arr;一个整数m;一个整数n。函数使用嵌套的for循环遍历矩阵的每个元素,最终,这个函数会按照矩阵的行列顺序打印出矩阵中的所有元素。
3、使用一个主函数,调用rotateMatrix
和printMatrix
这两个函数,输出原始矩阵和旋转后的矩阵。
#include <iostream>
using namespace std;
void rotateMatrix(int arr[3][3],int m, int n)//将二维数组表示的矩阵顺时针旋转90度
{
// 先转置矩阵
for (int i = 0; i < m; i++)
{
for (int j = i; j < n; j++)
{
int temp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = temp;
}
}
// 每一行按中心对称交换元素
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n / 2; j++)
{
int temp = arr[i][j];
arr[i][j] = arr[i][n - 1 - j];
arr[i][n - 1 - j] = temp;
}
}
}
void printMatrix(int arr[3][3], int m, int n)//打印一个二维数组 (矩阵)
{
for (int i = 0; i < m; i++)//控制行数
{
for (int j = 0; j < n; j++)//控制列数
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3; // 矩阵的行数
int n = 3; // 矩阵的列数
cout << "原始矩阵:" << endl;
printMatrix(arr, m, n);
rotateMatrix(arr, m, n);
cout << "旋转后的矩阵:" <<endl;
printMatrix(arr, m, n);
return 0;
}
结果