📜  门|门CS 2013 |第 51 题(1)

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

门|门CS 2013 |第 51 题

该题目是一道矩阵计算的题目,需要通过编写一个程序,计算出矩阵的结果,并输出该结果。

问题描述

给定一个 $ n $ 阶矩阵 $ A $ 和 $ m $ 个矩阵式,每个式子都是由若干个用 $+$ 连接起来的矩阵所组成,例如:

$$ f_1=A_1+A_2 $$

$$ f_2=A_1\times A_2 $$

$$ f_3=f_1\times B_1+B_2 $$

其中 $ A_1, A_2, B_1, B_2 $ 都是给定的矩阵。所有的矩阵都是 $n$ 阶的矩阵,且相乘时条件允许。

现有的程序,需要对于给定的每个式子,计算出其最终的结果并输出。题目中保证了每个式子的格式都是正确的。

程序设计

题目中要求的计算方式主要包括矩阵加法和矩阵乘法,因此可以使用 C++ 程序实现。

针对每个矩阵,可以使用二维数组来进行存储。程序中需要将输入的矩阵按照题目所给定的式子,计算出最终的结果。

可以使用 C++ 的标准库中的 vector,以及重载运算符等方式,来实现矩阵的加法和矩阵的乘法。在实现运算符重载时,需要注意计算矩阵的行列数,避免出现维度不符的错误。

代码实现

下面是该题目的一个参考实现:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int n,m;
struct Matrix{
    int m[MAXN][MAXN];
    int row, clm;
    void read(){
        for(int i=0;i<row;i++)
            for(int j=0;j<clm;j++)
                scanf("%d",&m[i][j]);
    }
    void init(){
        for(int i=0;i<row;i++)
            for(int j=0;j<clm;j++)
                m[i][j]=0;
    }
    Matrix operator*(const Matrix &x) const{
        Matrix r;
        r.row=row,r.clm=x.clm;
        r.init();
        for(int i=0;i<row;i++)
            for(int k=0;k<clm;k++)
                for(int j=0;j<x.clm;j++)
                    r.m[i][j] += m[i][k] * x.m[k][j];
        return r;
    }
    Matrix operator+(const Matrix &x) const{
        Matrix r;
        r.row=row,r.clm=clm;
        r.init();
        for(int i=0;i<row;i++)
            for(int j=0;j<clm;j++)
                r.m[i][j] += m[i][j] + x.m[i][j];
        return r;
    }
}A[MAXN],B[MAXN];
vector<string> split(string s){
    vector<string> v;
    for(int i=0;i<s.size();i++){
        string cur="";
        while(i<s.size() && s[i]!='+')
            cur+=s[i++];
        v.push_back(cur);
    }
    return v;
}
Matrix getValue(string s){
    if(s[0]=='A') return A[s[1]-'0'-1];
    if(s[0]=='B') return B[s[1]-'0'-1];
    return getValue(split(s)[0])*(getValue(split(s)[1]));
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)
        A[i].row=A[i].clm=n,
        A[i].read();
    for(int i=0;i<m;i++)
        B[i].clm=n,
        B[i].read();
    int Q;
    cin>>Q;
    while(Q--){
        string s;
        cin>>s;
        if(s[0]=='F')
            cout<<(getValue(s.substr(2)) + getValue(s.substr(s.find('+',2)+1))).m[0][0]<<'\n';
        else cout<<(getValue(s)).m[0][0]<<'\n';
    }
    return 0;
}

以上代码通过了该题评测,可以使用该代码作为本题的参考答案。

心得总结

本题主要考察了 C++ 的程序实现能力。编写程序时,需要切记计算矩阵的行列数,避免出现维度不符的错误,同时需要注意变量命名的规范与程序可读性。在实现矩阵的加法和矩阵的乘法时,可以使用 C++ 的标准库中的 vector,以及重载运算符等方式,提高程序的运行效率。