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;
}