PTA练习题——稀疏矩阵的加法。
题目分析:此题的核心在于找到行数和列数相等的元素进行求和,若和为零时则舍去,当行数/列数不等时分类进行讨论。
此题共分为七种情况进行讨论,分别为:
1 ai=bi;aj=bj
2 ai<bi;
3 ai>bi;
4 ai=bi; aj<bj
5 ai=bi; aj>bj
6 a输出完 b未输出完
7 b输出完 a未输出完
每种情况下如果该矩阵的元素用过了则计数器加一,并打破当前内部的循环,即使b数组未循环完也没有问题,因为两个循环中只有判断条件,打破后还能再回去。注意必须要把当a/b输出满的判断放在前面,否则可能会有多余的语句执行
三元组顺序表表示的稀疏矩阵加法。
输入格式:
输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。 按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。 按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。
输出格式:
输出第1行为相加后矩阵行数m、列数n及非零元素个数t。 输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。
输入样例1:
4 4 3 4
0 1 -5
1 3 1
2 2 1
0 1 3
1 3 -1
3 0 5
3 3 7
结尾无空行
输出样例1:
4 4 4
0 1 -2
2 2 1
3 0 5
3 3 7
结尾无空行
完整代码如下:
#include<iostream>
using namespace std;
typedef int status;
typedef struct {
int i, j;
int e;
}triple;
typedef struct {
triple data[100];
int mu, nu, tu;
}tsmatrix;
status summary(tsmatrix& a, tsmatrix& b, tsmatrix& c) {
int h = 1, l = 1, d = 1;
for (; h <= a.tu+1; ) {//对a矩阵进行循环
for (; l <= b.nu+1; ) {//对b矩阵进行循环
if ((a.data[h].i == b.data[l].i) && (a.data[h].j == b.data[l].j)) {//行列均相等时相加
c.data[d].e = a.data[h].e + b.data[l].e;//如果等于零还要舍去
c.data[d].i = a.data[h].i;
c.data[d].j = a.data[h].j;
if (c.data[d].e != 0) {//a与b矩阵元素和等于零时d不增,相当于舍去
d++;
}
l++;
h++;
break;
}else if (h == a.tu+1&&l!=b.tu+1) {//当a矩阵元素输出满后只对矩阵b进行输出
c.data[d].e = b.data[l].e;
c.data[d].i = b.data[l].i;
c.data[d].j = b.data[l].j;
d++;
l++;
if (l == b.tu + 1) {
h++;//继续加h以便于及时跳出循环
}
break;
}
else if (l == b.tu+1&&h!=a.tu+1) {//当b矩阵输出满后只对a矩阵进行输出
c.data[d].e = a.data[h].e;
c.data[d].i = a.data[h].i;
c.data[d].j = a.data[h].j;
d++;
h++;
if (h == a.tu + 1) {
l++;//继续加l以便于及时跳出循环
}
break;
}
else if (b.data[l].i<a.data[h ].i) {//当b的行数小于a时输出b,循环继续
c.data[d].e = b.data[l].e;
c.data[d].i = b.data[l].i;
c.data[d].j = b.data[l].j;
d++;
l++;
break;
}
else if (a.data[h].i < b.data[l].i) {//当a的行数小于b时输出a,循环继续
c.data[d].e = a.data[h].e;
c.data[d].i = a.data[h].i;
c.data[d].j = a.data[h].j;
d++;
h++;
break;
}
else if (a.data[h].i== b.data[l].i&& a.data[h].j >b.data[l].j) {//当行数相等,b的列数小时输出b
c.data[d].e = b.data[l].e;
c.data[d].i = b.data[l].i;
c.data[d].j = b.data[l].j;
d++;
l++;
break;
}
else if (a.data[h].i == b.data[l].i && a.data[h].j < b.data[l].j) {//当行数相等,a的列数小时输出a
c.data[d].e = a.data[h].e;
c.data[d].i = a.data[h].i;
c.data[d].j = a.data[h].j;
d++;
h++;
break;
}
}
}
c.tu = d-1;//元素数等于d-1因为最后d多加了一次
return 0;
}
int main() {
int m, n, t1, t2;
cin >> m >> n >> t1 >> t2;
tsmatrix a, b, c;
a.mu = m; a.nu = m; a.tu = t1;
b.mu = m; b.nu = m; b.tu = t2;
c.mu = m; c.nu = m;
for (int k = 1; k <= a.tu; k++) {
cin >> a.data[k].i >> a.data[k].j >> a.data[k].e;
//cout<< a.data[k].i << a.data[k].j << a.data[k].e<<endl;
}
for (int k = 1; k <= b.tu; k++) {
cin >> b.data[k].i >> b.data[k].j >> b.data[k].e;
}
summary(a, b, c);
//输出相加后的矩阵
cout << c.mu << ' ' << c.nu << ' ' << c.tu << endl;
for (int k = 1; k <= c.tu; k++) {
cout << c.data[k].i << ' ' << c.data[k].j << ' ' << c.data[k].e << endl;
}
return 0;
}