这个题上课有讲,但是没有完全讲
先按三元组的顺序把前两个矩阵存好,由于第三个矩阵会出现几行几列不知道,所以所有的位数都要初始化
但是矩阵是二维,实际存是一维数组,所以存的次序要好好考虑。而且题目给的数组是从1开始的
最妙的一步是讲三元组做乘法,考虑到矩阵乘法,肯定是两个for,一个A数组遍历所有B数组,关键是A数组的值不一定能和B数组的值在做乘法的时候碰到,而条件就是A的列要等于B的行
此题,先要定义一个结构,有行列,数值,再定义一个整体,有上面结构的data数组,再包括行数,列数,个数初始为0
录入两个数组,再初始化第三个数组
第三个数组是行列全包含,初值为0,之后输出的时候非零元输出
计算过程,遍历两个三元组,假如碰到A的列等于B的行,就计算,判断结构是否为0,不为0则加到相应位置上,新的结果如果等于此结果,说明是第一次加,则个数++,若新结果为0,则个数—
然后我写完,挂掉了,Debug了好久
#include<bits/stdc++.h>
using namespace std;
#define Max 10005
/*
100
1
2
1 1 1
2 1 1
1
100
2
1 1 1
1 100 1
*/
typedef struct {
int hang,lie,zhi;
}elem;
typedef struct{
elem data[Max];
int Hang,Lie,Shu=0;
}juzheng;
int main(void){
juzheng A,B,C;
scanf("%d\n%d\n%d",&A.Hang,&A.Lie,&A.Shu);
for(int i=0;i<A.Shu;i++){
scanf("%d %d %d",&A.data[i].hang,&A.data[i].lie,&A.data[i].zhi);
A.data[i].hang--;
A.data[i].lie--;
}
scanf("%d\n%d\n%d",&B.Hang,&B.Lie,&B.Shu);
for(int i=0;i<B.Shu;i++){
scanf("%d %d %d",&B.data[i].hang,&B.data[i].lie,&B.data[i].zhi);
B.data[i].hang--;
B.data[i].lie--;
}
C.Hang=A.Hang;
C.Lie=B.Lie;
for(int i=0;i<C.Hang;i++){
for(int j=0;j<C.Lie;j++){
C.data[i*C.Lie+j].zhi=0;
C.data[i*C.Lie+j].hang=i;
C.data[i*C.Lie+j].lie=j;
}
}
for(int i=0;i<A.Shu;i++){
for(int j=0;j<B.Shu;j++){
int ans=0;
if(A.data[i].lie==B.data[j].hang){
ans=A.data[i].zhi*B.data[j].zhi;
}
if(ans!=0){
C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi+=ans;
if(C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi==0){// 第一次加
C.Shu--;
//printf("%d %d\n",C.data[A.data[i].hang*A.Hang+B.data[j].lie].hang,C.data[A.data[i].hang*A.Hang+B.data[j].lie].lie);
}
else if(C.data[A.data[i].hang*C.Lie+B.data[j].lie].zhi==ans){//后面制0
C.Shu++;
}
}
}
}
printf("%d\n%d\n%d\n",C.Hang,C.Lie,C.Shu);
for(int i=0;i<C.Hang*C.Lie;i++){
if(C.data[i].zhi!=0){
printf("%d,%d,%d\n",C.data[i].hang+1,C.data[i].lie+1,C.data[i].zhi);
}
}
}