7-1 稀疏矩陣加法 (20 分)
給定兩個矩陣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 <bits/stdc++.h> using namespace std; struct node { int x,y,z; }; static bool cmp(node & a,node & b) { if(a.x<b.x)return true; if(a.x==b.x&&a.y<b.y)return true; return false; } int main() { int n,m; cin>>n>>m; vector<vector<int>> a,b; int k1; cin>>k1; for(int i=0;i<k1;i++){ int x,y,z; cin>>x>>y>>z; vector<int> t; t.push_back(x); t.push_back(y); t.push_back(z); a.push_back(t); } int k2; cin>>k2; for(int i=0;i<k2;i++){ int x,y,z; cin>>x>>y>>z; vector<int> t; t.push_back(x); t.push_back(y); t.push_back(z); b.push_back(t); } vector<node> ans; for(int i=0;i<k1;i++) { for(int j=0;j<k2;j++) { if(a[i][0]==b[j][0]&&a[i][1]==b[j][1])a[i][2]+=b[j][2]; } node t; t.x=a[i][0]; t.y=a[i][1]; t.z=a[i][2]; if(abs(t.z)>0.1) ans.push_back(t) ; } for(int j=0;j<k2;j++) { int flag=0; for(int i=0;i<k1;i++) { if(a[i][0]==b[j][0]&&a[i][1]==b[j][1]) { flag=1; break; } } node t; t.x=b[j][0]; t.y=b[j][1]; t.z=b[j][2]; if(flag==0)ans.push_back(t); } sort(ans.begin(),ans.end(),cmp); cout<<ans.size()<<endl; for(int i=0;i<ans.size();i++) { cout<<ans[i].x<<' '<<ans[i].y<<' '<<ans[i].z; if(i<ans.size()-1)cout<<endl; } return 0; }