📜  将矩阵旋转 45 度的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:39:19.837000             🧑  作者: Mango

将矩阵旋转 45 度的 C++ 程序介绍

矩阵旋转指的是将矩阵按顺时针或逆时针方向旋转一定角度后得到新的矩阵。本文将介绍如何编写一个 C++ 程序将矩阵旋转 45 度。

实现思路

我们可以将矩阵分成两部分,一部分是对角线及其上方的元素,另一部分是对角线下方的元素。然后对这两部分进行交换即可完成矩阵旋转。

具体实现过程如下:

  1. 对角线及其上方的元素与对角线下方的元素进行交换。
  2. 对于每个元素 matrix[i][j],根据对角线的位置来确定它在旋转后的位置。如果对角线在第 m 行第 n 列,那么旋转后 matrix[i][j] 会被移动到 matrix[m-j+i][n+i-j] 的位置。
  3. 如果矩阵的行数和列数不相等,则需要对矩阵进行先行后列的交换。
代码实现

下面是将矩阵旋转 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$ 是矩阵的大小。