矩阵旋转

Qin-Rong-2004-12- / 2023-07-11 / 原文

矩阵旋转

题目:使用C++,原地90℃旋转一个M*N的矩阵,不允许增加任何内存空间(空间复杂度为O(1))
分析:
1、使用一个函数transposeMatrix,这个函数通过对矩阵进行转置和中心对称交换,实现了将矩阵顺时针旋转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、使用了一个函数generatedMatrix,该函数用于打印一个二维数组(矩阵)。函数接受三个参数:一个二维整数数组arr;一个整数m;一个整数n。函数使用嵌套的for循环遍历矩阵的每个元素,最终,这个函数会按照矩阵的行列顺序打印出矩阵中的所有元素。
3、使用一个主函数,调用transposeMatrixgeneratedMatrix这两个函数,输出原始矩阵和旋转后的矩阵。

#include <iostream>
using namespace std;

void transposeMatrix(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 generatedMatrix(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;
    generatedMatrix(arr, m, n);

    transposeMatrix(arr, m, n);

    cout << "旋转后的矩阵:" <<endl;
    generatedMatrix(arr, m, n);

    return 0;
}

结果