矩阵旋转

矩阵旋转是一种常见的操作,通常包括将矩阵顺时针或逆时针旋转90度、180度或270度等。这里我将简要介绍如何进行顺时针旋转90度的操作,并给出示例代码。

顺时针旋转90度的方法:

要顺时针旋转一个n x n的矩阵,可以采用以下步骤:

  1. 转置矩阵:先将矩阵转置,即行变成列,列变成行。

  2. 反转每一行:然后反转每一行,可以得到顺时针旋转90度后的矩阵。

具体步骤如下:

  • 转置矩阵:对于矩阵中的每对元素 (i, j)(j, i),进行交换。
  • 反转每一行:对于矩阵的每一行,将元素按照中心轴进行交换。

示例代码:

以下是一个C++示例代码,演示了如何实现顺时针旋转90度的操作:

#include <iostream>
#include <vector>
using namespace std;

void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size();
    
    // Step 1: Transpose the matrix
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
    }
    
    // Step 2: Reverse each row
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n / 2; ++j) {
            swap(matrix[i][j], matrix[i][n - 1 - j]);
        }
    }
}

// Function to print a matrix
void printMatrix(const vector<vector<int>>& matrix) {
    int n = matrix.size();
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    cout << "Original Matrix:" << endl;
    printMatrix(matrix);
    
    rotate(matrix);
    
    cout << "\nMatrix after 90 degree clockwise rotation:" << endl;
    printMatrix(matrix);
    
    return 0;
}

解释代码:

  1. rotate 函数中的第一个循环实现了矩阵的转置,通过交换 matrix[i][j]matrix[j][i] 实现。

  2. rotate 函数中的第二个循环实现了每一行的反转,通过交换 matrix[i][j]matrix[i][n-1-j] 实现。

  3. printMatrix 函数用于打印矩阵,方便查看旋转前后的效果。

示例输出:

运行上述代码,将输出如下结果:

Original Matrix:
1 2 3 
4 5 6 
7 8 9 

Matrix after 90 degree clockwise rotation:
7 4 1 
8 5 2 
9 6 3 

这就是顺时针旋转90度后的矩阵。

以上是顺时针旋转矩阵,在下面我将介绍逆时针旋转矩阵:

逆时针旋转一个n x n的矩阵90度,可以采用类似的方法,但是步骤略有不同。以下是逆时针旋转90度的方法和示例代码:

逆时针旋转90度的方法:

要逆时针旋转一个n x n的矩阵90度,可以按照以下步骤进行:

  1. 转置矩阵:先将矩阵转置,即行变成列,列变成行。

  2. 反转每一列:然后反转每一列,可以得到逆时针旋转90度后的矩阵。

具体步骤如下:

  • 转置矩阵:对于矩阵中的每对元素 (i, j)(j, i),进行交换。
  • 反转每一列:对于矩阵的每一列,将元素按照中心轴进行交换。

示例代码:

以下是一个C++示例代码,演示了如何实现逆时针旋转90度的操作:

#include <iostream>
#include <vector>
using namespace std;

void rotateCounterClockwise(vector<vector<int>>& matrix) {
    int n = matrix.size();
    
    // Step 1: Transpose the matrix
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
    }
    
    // Step 2: Reverse each column
    for (int j = 0; j < n; ++j) {
        for (int i = 0; i < n / 2; ++i) {
            swap(matrix[i][j], matrix[n - 1 - i][j]);
        }
    }
}

// Function to print a matrix
void printMatrix(const vector<vector<int>>& matrix) {
    int n = matrix.size();
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    cout << "Original Matrix:" << endl;
    printMatrix(matrix);
    
    rotateCounterClockwise(matrix);
    
    cout << "\nMatrix after 90 degree counter-clockwise rotation:" << endl;
    printMatrix(matrix);
    
    return 0;
}

解释代码:

  1. rotateCounterClockwise 函数中的第一个循环实现了矩阵的转置,通过交换 matrix[i][j]matrix[j][i] 实现。

  2. rotateCounterClockwise 函数中的第二个循环实现了每一列的反转,通过交换 matrix[i][j]matrix[n-1-i][j] 实现。

  3. printMatrix 函数用于打印矩阵,方便查看旋转前后的效果。

示例输出:

运行上述代码,将输出如下结果:

Original Matrix:
1 2 3 
4 5 6 
7 8 9 

Matrix after 90 degree counter-clockwise rotation:
3 6 9 
2 5 8 
1 4 7 

这就是逆时针旋转90度后的矩阵。

以下标为1开始的示例代码:

以上代码都是基于从0开始的下标,以下我将介绍从下标为1开始的代码:

顺时针旋转90度:

#include <iostream>
#include <vector>
using namespace std;

void rotateClockwise(vector<vector<int>>& matrix) {
    int n = matrix.size() - 1; // 矩阵大小(去除空行)
    
    // Step 1: 转置矩阵
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
    }
    
    // Step 2: 反转每一行
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n / 2; ++j) {
            swap(matrix[i][j], matrix[i][n - j + 1]);
        }
    }
}

// 打印矩阵的函数(1-based索引)
void printMatrix(const vector<vector<int>>& matrix) {
    int n = matrix.size() - 1; // 矩阵大小(去除空行)
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = {
        {},
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    int n = matrix.size() - 1; // 矩阵的大小
    
    cout << "原始矩阵:" << endl;
    printMatrix(matrix);
    
    rotateClockwise(matrix);
    
    cout << "\n顺时针旋转90度后的矩阵:" << endl;
    printMatrix(matrix);
    
    return 0;
}

逆时针旋转90度:

#include <iostream>
#include <vector>
using namespace std;

void rotateCounterClockwise(vector<vector<int>>& matrix) {
    int n = matrix.size() - 1; // 矩阵大小(去除空行)
    
    // Step 1: 转置矩阵
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
    }
    
    // Step 2: 反转每一列
    for (int j = 1; j <= n; ++j) {
        for (int i = 1; i <= n / 2; ++i) {
            swap(matrix[i][j], matrix[n - i + 1][j]);
        }
    }
}

// 打印矩阵的函数(1-based索引)
void printMatrix(const vector<vector<int>>& matrix) {
    int n = matrix.size() - 1; // 矩阵大小(去除空行)
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = {
        {},
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    int n = matrix.size() - 1; // 矩阵的大小
    
    cout << "原始矩阵:" << endl;
    printMatrix(matrix);
    
    rotateCounterClockwise(matrix);
    
    cout << "\n逆时针旋转90度后的矩阵:" << endl;
    printMatrix(matrix);
    
    return 0;
}

posted @ 2024-07-20 16:27  Tomorrowland_D  阅读(39)  评论(0编辑  收藏  举报