题目描述:
思路:
先使用一个结构体对稀疏矩阵进行压缩存储typedef struct{ int row, col; int elem;} Array;
之后用归并的思想,将A矩阵与B矩阵相加的结果存放在C矩阵中
if (A[i].row //若A行号小于B行号,则将A放入C { C[k++] = A[i++]; } else if (A[i].row > B[j].row)//若A行号大于B行号,则存B { C[k++] = B[j++]; } else //若都不是,则代表A行号等于B行号 { if (A[i].col == B[j].col) //若A列号再等于B列号 { //值要相加 C[k].col = A[i].col; C[k].row = A[i].row; C[k++].elem = A[i++].elem + B[j++].elem; } //否则按照列号从小到大存进C else if (A[i].col C[k++] = A[i++]; else C[k++] = B[j++]; }
若A,B矩阵还有剩余元素,全部放入C即可
while (i < lenA) { C[k++] = A[i++]; } while (j < lenB) { C[k++] = B[j++]; }
完整代码如下:
#include #include using namespace std;typedef struct{ int row, col; int elem;} Array;int main(){ Array A[100]; Array B[100]; Array C[100]; int m, n; cin >> m >> n; int n1, n2; cin >> n1; int i = 0; int j = 0; while (n1--) { int r, c, e; cin >> r >> c >> e; A[i].row = r; A[i].col = c; A[i].elem = e; i++; } cin >> n2; while (n2--) { int r, c, e; cin >> r >> c >> e; B[j].row = r; B[j].col = c; B[j].elem = e; j++; } int lenA = i; int lenB = j; i = 0; j = 0; int k = 0; while (i < lenA && j < lenB) { if (A[i].row < B[j].row) { C[k++] = A[i++]; } else if (A[i].row > B[j].row) { C[k++] = B[j++]; } else { if (A[i].col == B[j].col) { C[k].col = A[i].col; C[k].row = A[i].row; C[k++].elem = A[i++].elem + B[j++].elem; } else if (A[i].col < B[j].col) C[k++] = A[i++]; else C[k++] = B[j++]; } } while (i < lenA) { C[k++] = A[i++]; } while (j < lenB) { C[k++] = B[j++]; } int lenc = k; int cnt = 0; for (k = 0; k < lenc; k++) { if (fabs(C[k].elem) > 0.1) cnt++; } cout << cnt << endl; for (k = 0; k < lenc; k++) { if (fabs(C[k].elem) > 0.1) { cout << C[k].row << " " << C[k].col << " " << C[k].elem << endl; } } return 0;}