7-4 稀疏矩阵加法 (20分)
给定两个矩阵A和B,求其和矩阵C=A+B。
输入格式:
第一行包含两个数Row和Col,分别表示矩阵的行数和列数,A和B的维度是一致的。
第二行只有一个数N1,表示接下来要输入的A中的非零元素的个数。
接下来是N1行,每一行都是i j A[i,j] 这样的形式,表示的A中第i行第j列的元素A[i,j],为了与大多数编程语言保持一致,它们都是从零开始的,也就是说下标的有效范围是[0,Row−1]×[0,Col−1]。
在N1行之后,是一个数N2,表示矩阵B中非零元素的数量,此后N2行描述B中的非零元素,它们与此前描述A中非零元素的形式一致。
矩阵元素的输入均遵循行主序。这里的所有的输入均可用int类型正确表示,可以假设输入均是合法的。
输出格式:
第一行输出和矩阵C=A+B中的绝对值大于0.1的元素个数N3,此后是N3行,按照行主序输出其中的非零元素,依次是行、列的下标和对应的元素。
输入样例:
2 2
1
1 1 1
1
0 0 1
输出样例:
2
0 0 1
1 1 1
答案样例:
本题想要考察三元组。首先要知道三元组如何表示,如何赋值。然后将两个三元组进行加法操作,再将题目要求的答案输出即可。
#include <iostream>
using namespace std;
typedef struct{
int row, col;
double w;
} Triple;
typedef struct{
Triple data[10000];
int n, m, num;
} TSMatrix, *PTSMatrix;
void Enter_Triple(PTSMatrix p, int row, int col, double w){//三元组元素添加函数
p->data[p->num].row = row;
p->data[p->num].col = col;
p->data[p->num].w = w;
p->num++;
}
void Add_Triple(PTSMatrix A, PTSMatrix B, PTSMatrix C){//执行加法运算
int i=0, j=0;
while(i<A->num && j<B->num){
if(A->data[i].row < B->data[j].row){//如果A的行号小则A入C
Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
i++;
}
else if(A->data[i].row > B->data[j].row){//如果B的行号小则A入C
Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
j++;
}
else if(A->data[i].row = B->data[j].row){//如果AB行号相等则开始比较列号
if(A->data[i].col < B->data[j].col){//如果A的列号较小则A入C
Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
i++;
}
else if(A->data[i].col > B->data[j].col){//如果B的列号小则A入C
Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
j++;
}
else{
if(B->data[j].w + A->data[i].w != 0)//如果列号也相等那就算一下它们的和,若是0那就不入了
Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w+A->data[i].w);
i++;
j++;
}
}
}
while(i < A->num){//如果A还有剩余的数,那就全部加入C
Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
i++;
}
while(j < B->num){//如果B还有剩余的数,那就全部加入C
Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
j++;
}
}
int Row, Col, N1, N2, cnt;
int main(){
TSMatrix A, B, C;
A.num = 0;
B.num = 0;
C.num = 0;
cin >> Row >> Col >> N1;
int x, y;
double w;
for(int i=0; i<N1; i++){
cin >>x >> y >> w;
Enter_Triple(&A, x, y, w);
}
cin >> N2;
for(int i=0; i<N2; i++){
cin >>x >> y >> w;
Enter_Triple(&B, x, y, w);
}
Add_Triple(&A, &B, &C);
for(int i=0; i<C.num; i++){
if(C.data[i].w > 0.1)
cnt++;
}
cout << cnt << endl;
for(int i=0; i<C.num; i++)
if(C.data[i].w > 0.1)
cout << C.data[i].row << " " << C.data[i].col << " " << C.data[i].w << endl;
return 0;
}
来都来了点个赞再走呗,一键三个连也行 ~ ,可以点下方链接进入我的bilibili主页转转,也可以关注我的个人公众号~后期公众号会发送一些比较好玩的东西
bilibili:羊卓的杨
公众号:羊卓的杨