1571:基础练习 矩阵乘法

Posted fengzeng666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1571:基础练习 矩阵乘法相关的知识,希望对你有一定的参考价值。

 

 题目:https://acmore.cc/problem/LOCAL/1571#desc

技术图片

 

解法一:二维数组(因为二维数组不能作为函数的返回值,所以处理起来比较麻烦,此时推荐使用vector表示二维数组,请看解法二)

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 int a[30][30] = { 0 };    //初始矩阵
  6 int b[30][30] = { 0 };      //结果矩阵
  7 
  8 int getMultiSum(int a1[][30], int a2[][30], int m, int i, int j)    //计算矩阵a1的第i行与矩阵a2的第j列相乘的结果,其中a1,a2是同为m阶的方阵
  9 {
 10     int result = 0;
 11     for (int k = 0; k < m; ++k)
 12     {
 13         result += a1[i][k] * a2[k][j];
 14     }
 15     return result;
 16 }
 17 
 18 
 19 int main()
 20 {
 21     int N, M; //N表示矩阵的阶数,M表示幂
 22     while (cin >> N >> M)
 23     {
 24         for (int i = 0; i < N; ++i)
 25             for (int j = 0; j < N; ++j)
 26                 cin >> a[i][j];
 27 
 28         switch (M)
 29         {
 30         case 0:        //矩阵的零次方是单位矩阵
 31             for (int i = 0; i < N; ++i)
 32                 b[i][i] = 1;
 33             break;
 34 
 35         case 1:
 36             for (int i = 0; i < N; ++i)
 37                 for (int j = 0; j < N; ++j)
 38                     b[i][j] = a[i][j];
 39         
 40         case 2:
 41             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 42             {
 43                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 44                 {
 45                     b[i][j] = getMultiSum(a, a, N, i, j);
 46                 }
 47 
 48             }
 49             break;
 50 
 51         case 3:
 52             int tmp[30][30];
 53             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 54             {
 55                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 56                 {
 57                     tmp[i][j] = getMultiSum(a, a, N, i, j);
 58                 }
 59 
 60             }
 61             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 62             {
 63                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 64                 {
 65                     b[i][j] = getMultiSum(a, tmp, N, i, j);
 66                 }
 67 
 68             }
 69             break;
 70 
 71         case 4:
 72             int tmp1[30][30];
 73             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 74             {
 75                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 76                 {
 77                     tmp1[i][j] = getMultiSum(a, a, N, i, j);
 78                 }
 79 
 80             }
 81             int tmp2[30][30];
 82             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 83             {
 84                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 85                 {
 86                     tmp2[i][j] = getMultiSum(a, tmp1, N, i, j);
 87                 }
 88 
 89             }
 90             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
 91             {
 92                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
 93                 {
 94                     b[i][j] = getMultiSum(a, tmp2, N, i, j);
 95                 }
 96 
 97             }
 98 
 99             break;
100 
101         case 5:
102             int tmp3[30][30];
103             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
104             {
105                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
106                 {
107                     tmp3[i][j] = getMultiSum(a, a, N, i, j);
108                 }
109 
110             }
111             int tmp4[30][30];
112             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
113             {
114                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
115                 {
116                     tmp4[i][j] = getMultiSum(a, tmp3, N, i, j);
117                 }
118 
119             }
120             int tmp5[30][30];
121             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
122             {
123                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
124                 {
125                     tmp5[i][j] = getMultiSum(a, tmp4, N, i, j);
126                 }
127 
128             }
129             for (int i = 0; i < N; ++i)    //i表示原矩阵的行
130             {
131                 for (int j = 0; j < N; ++j)    //j表示原矩阵的列
132                 {
133                     b[i][j] = getMultiSum(a, tmp5, N, i, j);
134                 }
135 
136             }
137 
138 
139             break;
140 
141         }
142 
143         for (int i = 0; i < N; ++i)
144         {
145             int j = 0;
146             for (; j < N-1; ++j)
147             {
148                 cout << b[i][j] <<  ;
149             }
150             cout << b[i][j] << endl;
151         }
152     }
153 
154     return 0;
155     
156 }

 

解法二: 使用vector代替二维数组

 

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 
 7 //矩阵a1与a2相乘,其中a1和a2都是N阶方阵,返回值为vector表示的二维数组
 8 vector<vector<int>> matrixMul(vector<vector<int>>a1, vector<vector<int>>a2, int N) 
 9 {
10     vector<vector<int>> result(30);
11     for (int i = 0; i < N; ++i)
12         for (int j = 0; j < N; ++j)
13             result[i].push_back(0);  //把结果矩阵置为0
14 
15 
16     for (int i = 0; i < N; i++)    //矩阵乘法的三重循环
17     {
18         for (int j = 0; j < N; j++)
19         {
20             for (int k = 0; k < N; k++)
21             {
22                 result[i][j] += a1[i][k] * a2[k][j];
23             }
24 
25         }
26     }
27 
28     return result;
29     
30 }
31 
32 
33 int main()
34 {
35     int N, M; //N表示矩阵的阶数,M表示幂
36     while (cin >> N >> M)
37     {
38         vector<vector<int>>a(30);    //原矩阵
39         vector<vector<int>>b(30);    //结果矩阵
40         int e;
41         for (int i = 0; i < N; ++i)
42             for (int j = 0; j < N; ++j)
43             {
44                 cin >> e;
45                 a[i].push_back(e);  //输入原矩阵
46             }
47 
48         for (int i = 0; i < N; ++i)
49             for (int j = 0; j < N; ++j)
50                 b[i].push_back(0);  //把结果矩阵初始化为0
51             
52         if (M == 0)
53         {
54             for (int i = 0; i < N; ++i)
55                 b[i][i] = 1;        //矩阵的零次方为单位矩阵
56         }
57         else 
58         {
59             b = a;        //矩阵的一次方
60             if(M > 1)    //矩阵的M次方(M大于1)
61                 for (int i = 0; i < M - 1; ++i)    
62                 {
63                     b = matrixMul(a, b, N);
64                 }
65         }
66     
67         
68         for (int i = 0; i < N; ++i)        //输出结果
69         {
70             int j = 0;
71             for (; j < N-1; ++j)
72             {
73                 cout << b[i][j] <<  ;
74             }
75             cout << b[i][j] << endl;
76         }
77     }
78 
79     return 0;
80     
81 }        

 

以上是关于1571:基础练习 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

试题 基础练习 矩阵乘法暴力矩阵乘法,再次了解一下矩阵

蓝桥杯基础练习---矩阵乘法

蓝桥网试题 java 基础练习 矩阵乘法

基础练习: 矩阵乘法

基础练习 矩阵乘法

基础练习 矩阵乘法 时间限制:1.0s 内存限制:512.0MB