[HPUVJ - 矩陣練習] B - 矩陣乘法

Link:點擊打開鏈接


B - 矩陣乘法
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

給定兩個矩陣AABB,你需要判斷它們是否可以相乘,若可以請輸出相乘後的矩陣。

Input

第一行輸入一個整數TT,代表有TT組測試數據。

每組數據第一行輸入兩個整數N,MN,M,代表矩陣AA的行、列。

接下來NN行,每行輸入MM個整數a[][]a[][]

之後一行輸入兩個整數n,mn,m,代表矩陣BB的行、列。

接下來nn行,每行輸入mm個整數b[][]b[][]

注:1<=T<=5001<=N,m<=1001<=M,n<=101<=1<=T<=500,1<=N,m<=100,1<=M,n<=10,1<=矩陣元素<=20<=20

Output

若矩陣ABA、B可以相乘,先輸出YESYES,再輸出相乘得到的矩陣。

對每行的矩陣元素,每兩個元素之間有一個空格,最後一個沒有空格。

反之輸出NONO

Sample Input

2
2 2
1 1
1 1
2 3
1 1 1
1 1 1
2 3
1 1 1
1 1 1
2 2
1 1
1 1 

Sample Output

YES
2 2 2
2 2 2
NO 


思路:

當第一個矩陣的列數等於第二個矩陣的行數時,可以相乘


Code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
int a[110][110],b[110][110],c[110][110];
int main()
{
	int t,N,M,n,m;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&N,&M);
		for(int i=1;i<=N;i++)
			for(int j=1;j<=M;j++)
				scanf("%d",&a[i][j]);
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&b[i][j]);
		if(M==n)
		{
			printf("YES\n");
			for(int i=1;i<=N;i++)
				for(int j=1;j<=m;j++)
				{
					c[i][j]=0;   //每次都要初始化
					for(int k=1;k<=M;k++)
						c[i][j]+=a[i][k]*b[k][j];
					printf("%d%c",c[i][j],j==m? '\n':' ');
				}
				
		}
		else
			printf("NO\n");
	}
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章