题目描述
给定2个rc阶矩阵m1、m2以及若干运算符包括:+、-、、=,分别代表加(m1+m2)、减(m1-m2)、乘(m1*m2)、赋值(m1=m2)操作。计算矩阵的运算结果。其中1<=r,c<=10。
输入
输入数据有多组,第一行为测试数据的组数T,每组测试数据由2个矩阵(m1和m2)和若干个运算符组成。每个矩阵的第一行是矩阵的行、列数r,c。后面有r行,每行c个整数。
运算以end结束。我们假设所有的运算操作均可以进行
输出
赋值运算不输出任何结果,其他运行均输出每次运算的结果,且每次输出结果矩阵后再输出一个空行。
样例输入
1
3 3
1 0 0
0 1 0
0 0 1
3 3
1 2 3
1 2 3
1 2 3
-
*
=
+
end
样例输出
0 -2 -3
-1 -1 -3
-1 -2 -2
1 2 3
1 2 3
1 2 3
2 4 6
2 4 6
2 4 6
分析:
按照线性代数的知识 实际上这题在表达上有很大的的问题 这就造成了很大的疑惑
事实上 能够进行相加的矩阵实际上就是同型矩阵没问题
但是能够相乘的矩阵 两个r*c的矩阵 就是r=c的意思 不然无法进行矩阵乘法
代码实现:
事实上在多次尝试中 我的string类型的s用getline输入不管怎么样都是WA 但是getline换成cin输入就AC了
#include<iostream>
#include<cstring>
using namespace std;
int a[11][11],b[11][11],z[11][11];
void shuchu(int r,int c)
{
int i,j;
for(i=1;i<=r;i++)
{
for(j=1;j<=c-1;j++)
cout<<z[i][j]<<" ";
cout<<z[i][j]<<endl;
}
cout<<endl;
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
int t,r,c,i,j,k;
string s;
while(cin>>t)
{
while(t--)
{
cin>>r>>c;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
cin>>a[i][j];
cin>>r>>c;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
cin>>b[i][j];
while(cin>>s)
{
if(s=="+")
{
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
z[i][j]=a[i][j]+b[i][j];
shuchu(r,c);
}
if(s=="-")
{
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
z[i][j]=a[i][j]-b[i][j];
shuchu(r,c);
}
if(s=="*")
{
memset(z,0,sizeof(z));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
for(k=1;k<=c;k++)
z[i][j]+=a[i][k]*b[k][j];
shuchu(r,c);
}
if(s=="=")
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
a[i][j]=b[i][j];
if(s=="end") break;
}
}
}
return 0;
}