原題
題目描述
給你兩個矩陣A(n*k),B(k*m),請求A*B。
輸入
第一行是一個整數K,表示樣例的個數。 每個樣例包含兩個矩陣A和B。 每個矩陣的第一行是兩個整數n,m,(1≤n,m≤10)表示矩陣的行和列 以后的n行,每行m個整數,每個整數的絕對值不超過100。輸入保證A和B是可乘的。
輸出
輸出每個樣例的結果矩陣,矩陣的整數之間用一個空格隔開,行尾無空格。
樣例輸入
2 2 2 1 1 1 1 2 1 1 1 2 2 1 1 1 1 2 2 1 1 1 0
樣例輸出
2 2 2 1 2 1
原題鏈接
傳送門?
代碼
#include<bits/stdc++.h>
using namespace std;const int N=20;
int a[N][N],b[N][N],c[N][N];int main()
{int t;scanf("%d",&t);while(t--){int n,k,l,m;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){for(int j=0;j<k;j++){scanf("%d",&a[i][j]);}}scanf("%d%d",&l,&m);for(int i=0;i<l;i++){for(int j=0;j<m;j++){scanf("%d",&b[i][j]);}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){c[i][j]=0;for(int h=0;h<k;h++){c[i][j]+=a[i][h]*b[h][j];}printf("%d",c[i][j]);if(j!=m-1) printf(" ");}printf("\n");}}return 0;
}
總結
1.矩陣乘法是啥對我來說可能是這道題最大的難點,矩陣乘法,簡單來說,給定兩個矩陣,第一個矩陣的列數和第二個矩陣的行數相等,兩個矩陣相乘的結果是,一個新的矩陣,新的矩陣行數和第一個矩陣相等,列數和第二個矩陣相等,比如一個2行3列的矩陣,乘以一個3行2列的矩陣,答案是一個2行2列的矩陣,答案矩陣的第一行第一個元素是,第一個矩陣第一行的所有元素和第二個矩陣第一列的所有元素逐項相乘并求和,答案矩陣第一行第二個元素是,第一個矩陣第一行所有元素和第二個矩陣第二列所有元素逐項相乘并求和?
2.題目保證了第一個矩陣的列數等于第二個矩陣的行數
3.行尾沒有空格,注意判斷每一行最后一個元素的數組下標
4.每一次使用c數組都需要初始化,防止前一次循環對當前循環產生影響
5.(有時候感覺一摸一樣的代碼難以ac,重新敲一遍可以通過,算是一個魔咒還是因為啥原原因……)