📜  矩阵对角线镜像的C++程序(1)

📅  最后修改于: 2023-12-03 14:56:29.858000             🧑  作者: Mango

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

简介

本文将介绍如何使用C++编写一个矩阵的对角线镜像程序。矩阵对角线镜像是指将矩阵沿主对角线(从左上角到右下角)翻转,即矩阵中的每个元素都与主对角线对称的元素位置上的元素交换。例如,对于以下矩阵:

1 2 3
4 5 6
7 8 9

经过对角线镜像后,变成:

1 4 7
2 5 8
3 6 9
算法

对于一个n x n的矩阵,假设矩阵的元素为a[i][j],其中i和j均从0开始,且i和j的范围均为0到n-1。矩阵的对角线镜像可以通过以下代码来实现:

for(int i = 0; i < n; i++){
    for(int j = i + 1; j < n; j++){
        swap(a[i][j], a[j][i]);
    }
}

for(int i = 0; i < n; i++){
    for(int j = 0; j < n / 2; j++){
        swap(a[i][j], a[i][n - j - 1]);
    }
}

首先,第一个循环从矩阵的左上角开始,交换矩阵中位置为(i,j)和(j,i)的元素。这是矩阵对角线镜像的第一步。

然后,第二个循环从矩阵的第一行开始,将第j列和第n-j-1列的元素进行交换。此时,矩阵已经完成了对角线镜像。

示例代码

以下是一个完整的矩阵对角线镜像的C++程序示例:

#include <iostream>
using namespace std;

void mirror(int **a, int n){
    // 对角线镜像
    for(int i = 0; i < n; i++){
        for(int j = i + 1; j < n; j++){
            swap(a[i][j], a[j][i]);
        }
    }
    // 左右翻转
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n / 2; j++){
            swap(a[i][j], a[i][n - j - 1]);
        }
    }
}

int main(){
    // 声明一个3x3的矩阵
    int **a;
    a = new int *[3];
    for(int i = 0; i < 3; i++){
        a[i] = new int[3];
    }

    // 给矩阵赋值
    int cnt = 1;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            a[i][j] = cnt;
            cnt++;
        }
    }

    cout << "矩阵对角线镜像前:" << endl;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            cout << a[i][j] << " ";
        }
        cout << endl;
    }

    // 进行矩阵对角线镜像
    mirror(a, 3);

    cout << "矩阵对角线镜像后:" << endl;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            cout << a[i][j] << " ";
        }
        cout << endl;
    }

    // 释放矩阵内存
    for(int i = 0; i < 3; i++){
        delete[] a[i];
    }
    delete[] a;

    return 0;
}

代码中,首先声明了一个3x3的矩阵a,并赋值为从1到9的连续整数。然后,通过调用mirror函数,对矩阵进行对角线镜像。最后,释放矩阵内存,程序运行完毕。