【问题描述】
稀疏矩阵可以以压缩方式进行存储,即:用一个n行3列矩阵只存储非零元素。每行存储一个非零元素,每行第一个为非零元素行标;第二个为非零元素列标;第三个为非零元素本身。如下左边为一个稀疏矩阵,右边是其存储形式。编写程序实现用上述压缩存储方式输入的稀疏矩阵的乘法,稀疏矩阵最大为9*9。以压缩方式输出结果矩阵。行标和列标都从0开始计数。
0 0 0 10 0 3 10
2 0 0 0 1 0 2
0 0 3 1 2 2 3
1 0 0 0 2 3 1
3 0 1
【输入形式】
先从控制台输入第一个矩阵的非零元素个数,再以压缩方式输入第一个矩阵的元素,即:分行输入非零元素的行标、列标和非零元素数据本身,以一个空格分隔行标、列标和非零元素。然后以同样方式输入第二个矩阵。
【输出形式】
在标准输出上以压缩方式分行输出结果矩阵,即:每行分别输出结果矩阵中非零元素的行标、列标和非零元素数据本身,行标、列标和非零数据之间以一个空格分隔,但每行最后一个数据后没有空格。先输出行标小的元素,若行标相同,则先输出列标小的元素。若没有非零元素,则不输出任何信息。
【输入样例】
5
0 3 10
1 0 2
2 2 3
2 3 1
3 0 1
2
0 1 200
2 2 -5
【输出样例】
1 1 400
2 2 -15
3 1 200
【样例说明】
输入的两个矩阵中的行、列最大下标均为3,所以可以看成是4*4的矩阵,即输入的两个矩阵分别为:
0 0 0 10
2 0 0 0
0 0 3 1
1 0 0 0
0 200 0 0
0 0 0 0
0 0 -5 0
0 0 0 0
两矩阵相乘的结果为:
0 0 0 0
0 400 0 0
0 0 -15 0
0 200 0 0
#include <stdio.h>
#include <stdlib.h>
#define maxn 15
//定义节点
typedef struct node {
int row, col, v;
} node;
//定义三元组存储稀疏矩阵
struct T {
node Node[maxn];
int MAXrow, MAXcol, MAXsize;
} TA, TB, TC;
int main() {
int num1,num2,i,j,k,sum,p,q;
scanf("%d", &num1);//输入a矩阵
TA.MAXsize = num1;
for(i=0;i<num1;i++)
{
scanf("%d%d%d",&TA.Node[i].row,&TA.Node[i].col,&TA.Node[i].v);
}
TA.MAXrow = maxn;
TA.MAXcol = maxn;
scanf("%d", &num2);//输入b矩阵
TB.MAXsize = num2;
for(k=0;k<num2;k++)
{
scanf("%d%d%d",&TB.Node[k].row,&TB.Node[k].col,&TB.Node[k].v);
}
TB.MAXrow = maxn;
TB.MAXcol = maxn;
TC.MAXsize = 0;
TC.MAXrow = maxn;
TC.MAXrow = maxn;
for(i = 0; i < maxn; i++) {//计算c矩阵
for(j = 0; j < maxn; j++) {
sum = 0;
for(p = 0; p < TA.MAXsize ; p++) {
if(TA.Node[p].row != i) continue;
for(q = 0; q < TB.MAXsize; q++) {
if(TB.Node[q].col != j) continue;
if(TA.Node[p].col == TB.Node[q].row) {
sum += TA.Node[p].v * TB.Node[q].v;
}
}
}
if(sum != 0) {
TC.Node[TC.MAXsize].row = i;
TC.Node[TC.MAXsize].col = j;
TC.Node[TC.MAXsize].v = sum;
TC.MAXsize++;
}
}
}
for(i=0;i<TC.MAXsize;i++)
{
printf("%d %d %d\n",TC.Node[i].row,TC.Node[i].col,TC.Node[i].v);
}
return 0;
}