给定两个矩阵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;
}