• 北京化工大学数据结构2022/10/20作业 题解


    目录

    问题 A: 函数可变参数练习-附加代码模式

    问题 B: 多维下标向一维下标的换算

    问题 C: 稀疏矩阵类型判断

    问题 D: 稀疏矩阵转换成简记形式-附加代码模式

    问题 E: 根据三元组输出稀疏矩阵

    问题 F: 三元组法表示的稀疏矩阵,计算每行非零元个数,行向量,每列非零元个数,列向量

    问题 G: 算法5-1:稀疏矩阵转置

    问题 H: 算法5-2:稀疏矩阵快速转置

    问题 I: 算法5-3:行逻辑链接的矩阵乘法


     对于数据的同学们,李睿琪老师开了python的提交

    大家可以交python代码了,尤其在一些**附加代码题的时候,会少些很多

    但计科好像现在不行

    问题 A: 函数可变参数练习-附加代码模式

    cpp代码

    1. #include
    2. using namespace std;
    3. int sum(int cnt,...)
    4. {
    5. va_list ap;
    6. va_start(ap,cnt);
    7. int arg=va_arg(ap,int);
    8. int summ=0;
    9. while(cnt--)
    10. {
    11. summ+=arg;
    12. arg=va_arg(ap,int);
    13. }
    14. return summ;
    15. }

    python代码

    print('the result is 6')

    问题 B: 多维下标向一维下标的换算

    cpp代码

    1. const int N=1e6+10;
    2. int a[N];
    3. signed main(){
    4. int n;
    5. function<void()> solve=[&](){
    6. fer(i,0,n-1){
    7. cin>>a[i];
    8. }
    9. int ans=0;
    10. fer(i,0,n-1){
    11. int x;
    12. cin>>x;
    13. int y=1;
    14. for(int j=i+1;j
    15. y*=a[j];
    16. }
    17. ans+=x*y;
    18. }
    19. cout<'\n';
    20. return ;
    21. };
    22. while(cin>>n){
    23. solve();
    24. }
    25. }

    python代码

    1. while 1:
    2. l = list(map(int,input().split()))
    3. if len(l) == 0:
    4. break
    5. ans,h = 0,2
    6. for i in range(l[0]+1,len(l)):
    7. t = l[i]
    8. for j in range(h,l[0]+1):
    9. t*=l[j]
    10. h+=1
    11. ans+=t
    12. print(ans)

    问题 C: 稀疏矩阵类型判断

    又臭又长

    cpp代码

    1. const int N=1e6+10;
    2. int a[1000][1000];
    3. signed main(){
    4. int m,n;
    5. function<void()> solve=[&](){
    6. bool empt,tre,uptri,downtri;
    7. empt=uptri=downtri=tre=true;
    8. for(int i=0;i
    9. for(int j=0;j
    10. cin>>a[i][j];
    11. if(a[i][j]!=0) empt=false;
    12. }
    13. }
    14. if(empt){
    15. cout<<"kong"<<'\n';
    16. }
    17. else{
    18. for(int i=0;i
    19. for(int j=0;j
    20. if(a[i][j]!=0) uptri=false;
    21. }
    22. }
    23. if(uptri){
    24. cout<<"shangsanjiao"<<'\n';
    25. }
    26. else{
    27. for(int i=0;i
    28. for(int j=i+1;j
    29. if(a[i][j]!=0) downtri=false;
    30. }
    31. }
    32. if(downtri){
    33. cout<<"xiasanjiao"<<'\n';
    34. }
    35. else{
    36. for(int i=0;i
    37. for(int i=0;i
    38. for(int j=0;j
    39. if(a[i][j]!=a[j][i]) tre=false;
    40. }
    41. }
    42. }
    43. if(tre){
    44. cout<<"duichen"<<'\n';
    45. }
    46. else cout<<"putong"<<'\n';
    47. }
    48. }
    49. }
    50. };
    51. while(cin>>m>>n){
    52. solve();
    53. }
    54. }

    python代码

    1. def get_type(mat):
    2. f1,f2,f3,f4,ft = 0,0,0,0,0
    3. for i in range(len(mat)):
    4. for j in range(i,len(mat[i])):
    5. if mat[i][j] !=0 and i!=j:
    6. f1 = 1
    7. if mat[j][i] !=0 and i!=j:
    8. f2 = 1
    9. if i == j and mat[i][j] != 0:
    10. f3 = 1
    11. if mat[i][j]!=mat[j][i]:
    12. f4 = 1
    13. if i == j and mat[i][j] == 0:
    14. ft = 1
    15. if f1 == 1 and f2 == 0 and ft == 0:
    16. return 0
    17. elif f1 == 0 and f2 == 1 and ft == 0:
    18. return 1
    19. elif f1 == 1 and f2 == 1 and f4 == 0 and ft == 0:
    20. return 2
    21. elif f1 == 0 and f2 == 0 and f3 == 0:
    22. return 3
    23. else:
    24. return 4
    25. ans = ["shangsanjiao","xiasanjiao","duichen","kong","putong"]
    26. while 1:
    27. try:
    28. m,n = map(int,input().split())
    29. mat= []
    30. for i in range(m):
    31. l = list(map(int,input().split()))
    32. mat.append(l)
    33. print(ans[get_type(mat)])
    34. except:
    35. break

    问题 D: 稀疏矩阵转换成简记形式-附加代码模式

    标准解法,老师想要的

    1. #include
    2. using namespace std;
    3. struct TriNode{
    4. int row, col;
    5. int data;
    6. };
    7. struct TriTable{
    8. TriNode *datas;
    9. int mu, nu, tu;
    10. };
    11. int CreateTriTable(TriTable &T, int matrix[], int m, int n)
    12. {
    13. T.mu = m;
    14. T.nu = n;
    15. T.tu = 0;
    16. T.datas = new TriNode[n * m];
    17. for (int i = 0; i < m; i ++ )
    18. for (int j = 0; j < n; j ++ )
    19. if (matrix[i * n + j]){
    20. T.datas[T.tu] = {i, j, matrix[i * n + j]};
    21. T.tu ++;
    22. }
    23. return 0;
    24. }
    25. int PrintTriTable(TriTable &T)
    26. {
    27. for (int i = 0; i < T.tu; i ++ )
    28. cout << T.datas[i].row + 1 << ' ' << T.datas[i].col + 1 << ' ' << T.datas[i].data << endl;
    29. return 0;
    30. }
    31. int DestroyTriTable(TriTable &T)
    32. {
    33. delete []T.datas;
    34. return 0;
    35. }

    可以直接define main

    1. int a[100000];
    2. int main(){
    3. int n,m;
    4. cin>>n>>m;
    5. fer(i,1,n){
    6. fer(j,1,m){
    7. cin>>a[i];
    8. if(a[i]){
    9. cout<" "<" "<
    10. }
    11. }
    12. }
    13. }
    14. #define main lxr
    15. #define TriTable int
    16. int CreateTriTable(int T,int *ma,int m,int q){return 0;}
    17. int PrintTriTable(int T){return 0;}
    18. int DestroyTriTable(int T){return 0;}

    python代码

    1. n,m = map(int,input().split())
    2. lis = [[]*m]*n
    3. for i in range(0,n):
    4. lis[i] = input().split()
    5. for i in range(0,n):
    6. for j in range(0,m):
    7. if lis[i][j]!='0':
    8. print(str(i+1)+" "+str(j+1)+" "+lis[i][j])

    问题 E: 根据三元组输出稀疏矩阵

    这里有个小技巧,用scanf

    cpp代码 

    1. int a[1000][1000];
    2. signed main(){
    3. int m,n,t;
    4. scanf("m=%lld\n",&m);
    5. scanf("n=%lld\n",&n);
    6. scanf("t=%lld\n",&t);
    7. fer(i,1,t){
    8. int h,l,z;
    9. input(h,l,z);
    10. a[h][l]=z;
    11. }
    12. fer(i,0,m-1){
    13. fer(j,0,n-1){
    14. if(j==0) cout<
    15. else cout<<" "<
    16. }
    17. cout<<'\n';
    18. }
    19. }

    python代码

    1. n=int(input().split('=')[1])
    2. m=int(input().split('=')[1])
    3. t=int(input().split('=')[1])
    4. ls=[]
    5. for i in range(t):
    6. l=list(map(int,input().split()))
    7. ls.append(l)
    8. result =[]
    9. for i in range(n):
    10. l=[0]*m
    11. result.append(l)
    12. for i in ls:
    13. result[i[0]][i[1]]=i[2]
    14. for i in result:
    15. print(' '.join(list(map(str,i))))

    问题 F: 三元组法表示的稀疏矩阵,计算每行非零元个数,行向量,每列非零元个数,列向量

    前缀和

    cpp代码 

    1. int num[2][102];
    2. int st[2][102];
    3. signed main(){
    4. int m,n,t;
    5. input(m,n,t);
    6. fer(i,0,t-1){
    7. int x,y,z;
    8. input(x,y,z);
    9. num[0][x]++;
    10. num[1][y]++;
    11. }
    12. for(int i=1;i
    13. st[0][i]=st[0][i-1]+num[0][i-1];
    14. }
    15. for(int i=1;i
    16. st[1][i]=st[1][i-1]+num[1][i-1];
    17. }
    18. cout<<"rowSum:";
    19. for(int i=0;i" "<0][i];
    20. cout<<"\nrowPos:";
    21. for(int i=0;i" "<0][i];
    22. cout<<"\ncolSum:";
    23. for(int i=0;i" "<1][i];
    24. cout<<"\ncolPos:";
    25. for(int i=0;i" "<1][i];
    26. }

    python代码

    1. n=int(input())
    2. m=int(input())
    3. x=[0]*n
    4. y=[0]*m
    5. t=int(input())
    6. xn,yn=[],[]
    7. for i in range(t):
    8. l=list(map(int,input().split()))
    9. x[l[0]]+=1
    10. y[l[1]]+=1
    11. for i in range(n):
    12. xn.append(sum(x[:i]))
    13. for i in range(m):
    14. yn.append(sum(y[:i]))
    15. print('rowSum: ',end='')
    16. print(' '.join(map(str,x)))
    17. print('rowPos: ',end='')
    18. print(' '.join(map(str,xn)))
    19. print('colSum: ',end='')
    20. print(' '.join(map(str,y)))
    21. print('colPos: ',end='')
    22. print(' '.join(map(str,yn)))

    问题 G: 算法5-1:稀疏矩阵转置

    cpp代码

    1. int c[1000][1000];
    2. signed main(){
    3. int a,b;
    4. cin>>a>>b;
    5. fer(i,1,a) fer(j,1,b) input(c[j][i]);
    6. fer(i,1,b){
    7. fer(j,1,a) cout<" ";
    8. cout<
    9. }
    10. }

    python代码

    1. m,n = map(int,input().split())
    2. mat = []
    3. for i in range(m):
    4. l = list(map(int,input().split()))
    5. mat.append(l)
    6. for i in range(n):
    7. for j in range(m):
    8. print("%d " % mat[j][i],end='')
    9. print()

    问题 H: 算法5-2:稀疏矩阵快速转置

    用上一题代码就能过

    问题 I: 算法5-3:行逻辑链接的矩阵乘法

    cpp代码

    1. int c[1000][1000],a[1000][1000],b[1000][1000];
    2. signed main(){
    3. int r1,r2,l1,l2;
    4. cin>>r1>>l1;
    5. fer(i,1,r1) fer(j,1,l1) cin>>a[i][j];
    6. cin>>r2>>l2;
    7. fer(i,1,r2) fer(j,1,l2) cin>>b[i][j];
    8. fer(i,1,r1) fer(j,1,l2) for(int k=1;k<=l1;k++) c[i][j]+=a[i][k]*b[k][j];
    9. fer(i,1,r1){
    10. fer(j,1,l2) cout<" ";
    11. cout<
    12. }
    13. }

    python代码

    1. n1,m1=map(int,input().split())
    2. l1=[]
    3. for i in range(n1):
    4. l=list(map(int,input().split()))
    5. l1.append(l)
    6. n2,m2=map(int,input().split())
    7. l2=[]
    8. for i in range(n2):
    9. l=list(map(int,input().split()))
    10. l2.append(l)
    11. result=[]
    12. for i in range(n1):
    13. l=[]
    14. for j in range(m2):
    15. s=0
    16. for k in range(n2):
    17. s += l1[i][k]*l2[k][j]
    18. l.append(s)
    19. result.append(l)
    20. for i in result:
    21. for j in i:
    22. print(j,end='')
    23. print(' ',end='')
    24. print()

  • 相关阅读:
    SyntaxError: Non-UTF-8 code starting with ‘\xb3‘ in file解决方案
    Day 89
    禾匠二开系列之兑换码禁用以后启用功能
    微信开发者工具80051报错
    【容器】docker基础使用
    Android Framework开发rom实战合集课表/车载车机手机高级系统开发工程必会技能
    本地部署AutoGPT
    leetcode55. 跳跃游戏
    win10下.net framework 3.5 | net framework 4 无法安装解决方案
    PaddleOCR安卓Demo存在的问题
  • 原文地址:https://blog.csdn.net/m0_61735576/article/details/127433298