PTA 稀疏矩阵加法

397 阅读2分钟

给定两个矩阵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>
include <cstdlib>
using namespace std;
typedef struct {
	int x, y;
	int z;
}node;
 
int main(void) {
	node A[1000], B[1000], C[1000];
	int n, m;
	int N1, N2, i, j, k;
	cin >> n >> m;
	cin >> N1;
	for (i = 0; i < N1; i++) {
		cin >> A[i].x >> A[i].y >> A[i].z;
	}
	cin >> N2;
	for (i = 0; i < N2; i++) {
		cin >> B[i].x >> B[i].y >> B[i].z;
	}
	i = 0;
	j = 0;
	k = 0;
 
	while (i < N1 && j < N2)
	{
		if (A[i].x < B[j].x)
		{
			C[k].x = A[i].x;
			C[k].y = A[i].y;
			C[k].z = A[i].z;
			k++;
			i++;
		}
		else if (B[j].x < A[i].x)
		{
			C[k].x = B[j].x;
			C[k].y = B[j].y;
			C[k].z = B[j].z;
			k++;
			j++;
		}
		else
		{
			if (A[i].y < B[j].y)
			{
				C[k].x = A[i].x;
				C[k].y = A[i].y;
				C[k].z = A[i].z;
				k++;
				i++;
			}
			else if (B[j].y < A[i].y)
			{
				C[k].x = B[j].x;
				C[k].y = B[j].y;
				C[k].z = B[j].z;
				k++;
				j++;
			}
			else
			{
				if (A[i].z + B[j].z != 0)
				{
					C[k].x = A[i].x;
					C[k].y = A[i].y;
					C[k].z = A[i].z + B[j].z;
					k++;
				}
				i++;
				j++;
			}
		}
	}
	if (i == N1 && j != N2)
		while (j < N2)
		{
			C[k].x = B[j].x;
			C[k].y = B[j].y;
			C[k].z = B[j].z;
			k++;
			j++;
		}
	if (j == N2 && i != N1)
		while (i < N1)
		{
			C[k].x = A[i].x;
			C[k].y = A[i].y;
			C[k].z = A[i].z;
			k++;
			i++;
		}
	if (k == 0) {
		cout << k << endl;
	}
	else
	{
		cout << k << endl;
		for (i = 0; i < k - 1; i++)
			cout << C[i].x << ' ' << C[i].y << ' ' << C[i].z << endl;
		cout << C[i].x << ' ' << C[i].y << ' ' << C[i].z << endl;
	}
	return 0;
}

提交结果:

2.png