C++程序 矩阵沿对角线的镜像

C++程序 矩阵沿对角线的镜像

给定一个 N x N 的二维数组,打印一个沿对角线镜像的矩阵。我们需要以这样的方式打印结果:将对角线上方的三角形值与下方的交换,如镜像图像交换。以矩阵布局打印获取的二维数组。

例子:

输入: int mat[][] = {{1 2 4 }
                       {5 9 0}
                       {3 1 7}}
输出:  1 5 3 
       2 9 1
       4 0 7

输入: mat[][] = {{1  2  3  4 }
                 {5  6  7  8 }
                 {9  10 11 12}
                 {13 14 15 16}}
输出: 1 5 9 13 
       2 6 10 14  
       3 7 11 15 
       4 8 12 16 

一个 简单的解决方案 涉及额外的空间。我们遍历所有正左对角线 (从右到左)。在对角线遍历过程中,我们先将所有元素推入堆栈,然后再次遍历并用堆栈元素替换对角线的每个元素。

下面的实现是上述思路的实现。

// 简单的 CPP 程序,用于查找沿对角线的矩阵镜像。
#include 
using namespace std;

const int MAX = 100;

void imageSwap(int mat[][MAX], int n)
{
    // 起始于矩阵的第一行的对角线
    int row = 0;

    // 遍历所有的右上对角线
    for (int j = 0; j < n; j++) {

        // 这里我们使用堆栈来翻转对角线上元素的顺序
        stack s;
        int i = row, k = j;
        while (i < n && k >= 0)
            s.push(mat[i++][k--]);

        // 将所有元素按相反顺序推回矩阵中
        i = row, k = j;
        while (i < n && k >= 0) {
            mat[i++][k--] = s.top();
            s.pop();
        }
    }

    // 对于起始于最后一列的对角线,进行相同的处理
    int column = n - 1;
    for (int j = 1; j < n; j++) {

        // 这里我们使用堆栈来翻转对角线上元素的顺序
        stack s;
        int i = j, k = column;
        while (i < n && k >= 0)
            s.push(mat[i++][k--]);

        // 将所有元素按相反顺序推回矩阵中
        i = j;
        k = column;
        while (i < n && k >= 0) {
            mat[i++][k--] = s.top();
            s.pop();
        }
    }
}

// 实用函数:打印一个矩阵
void printMatrix(int mat[][MAX], int n)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << mat[i][j] << " ";
        cout << endl;
    }
}

// 主函数:测试上面的函数
int main()
{
    int mat[][MAX] = { { 1, 2, 3, 4 },
                       { 5, 6, 7, 8 },
                       { 9, 10, 11, 12},
                       { 13, 14, 15, 16 } };
    int n = 4;
    imageSwap(mat, n);
    printMatrix(mat, n);
    return 0;
}  

输出:

1 5 9 13 
2 6 10 14 
3 7 11 15 
4 8 12 16

时间复杂度: O(n*n)

辅助空间: O(1)

一个 高效的解决方案 是,如果我们观察一个输出矩阵,我们注意到我们只需要交换 (mat[i][j] 到 mat[j][i])。
下面是上述思路的实现。

// 高效的CPP程序,用于在对角线上找到矩阵的镜像。
#include
using namespace std;
 
const int MAX = 100;
 
void imageSwap(int mat[][MAX], int n)
{
    // 遍历矩阵并交换mat [i] [j]与mat [j] [i]
    for (int i = 0; i < n; i++)
        for (int j = 0; j <= i; j++)
            mat[i][j] = mat[i][j] + mat[j][i] -
                       (mat[j][i] = mat[i][j]);      
}
 
// 实用程序函数来打印矩阵
void printMatrix(int mat[][MAX], int n)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << mat[i][j] << " ";
        cout << endl;
    }
}
 
// 驱动程序测试上述功能
int main()
{
    int mat[][MAX] = { { 1, 2, 3, 4 },
                     { 5, 6, 7, 8 },
                     { 9, 10, 11, 12 },
                     { 13, 14, 15, 16 } };
    int n = 4;
    imageSwap(mat, n);
    printMatrix(mat, n);
    return 0;
}  

输出:

1 5 9 13 
2 6 10 14 
3 7 11 15 
4 8 12 16 

时间复杂度: O(n*n)

辅助空间: : O(1),因为它使用常量空间。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例