共63道题,当前是第63

Description

1	#include <bits/stdc++.h>
2	using namespace std;
3	#define maxn 110
4	struct node {
5		int r, c;
6		int A[maxn][maxn];
7	} G[maxn];
8	void Change(int id){
9		int B[maxn][maxn];
10		for (int i = 1; i <= G[id].r; ++i){
11			for (int j = 1; j <= G[id].c; ++j){
12				B[j][i] = G[id].A[i][j];
13			}
14		}
15		swap(G[id].r, G[id].c);
16		for (int i = 1; i <= G[id].r; ++i){
17			for (int j = 1; j <= G[id].c; ++j){
18				G[id].A[i][j] = B[j][i];
19			}
20		}
21	}
22	void Add(int a, int b){
23		for (int i = 1; i <= G[a].r; ++i){
24			for (int j = 1; j <= G[a].c; ++j){
25				G[a].A[i][j] += G[b].A[i][j];
26			}
27		}
28	}
29	void Subtract(int a, int b){
30		for (int i = 1; i <= G[a].r; ++i){
31			for (int j = 1; j <= G[a].c; ++j){
32				G[a].A[i][j] -= G[b].A[i][j];
33			}
34		}
35	}
36	void Multiply(int a, int b){
37		int Sum[maxn][maxn];
38		for (int i = 1; i <= G[a].r; ++i){
39			for (int j = 1; j <= G[b].c; ++j){
40				for (int k = 1; k <= G[a].c; ++k){
41					Sum[i][j] = G[a].A[i][k] * G[b].A[k][j];
42				}
43			}
44		}
45		G[a].c = G[b].c;
46		for (int i = 1; i <= G[a].r; ++i){
47			for (int j = 1; j <= G[a].c; ++j){
48				G[a].A[i][j] = Sum[i][j];
49			}
50		}
51	}
52	void print1(int id){
53		for (int i = 1; i <= G[id].r; ++i){
54			for (int j = 1; j <= G[id].c; ++j){
55				printf("%d%c", G[id].A[i][j], j < G[id].c ? 
56												' ': '\n');
57			}
58		}
59	}
60	void print2(char str[]){
61		printf("%s\n", str);
62	}
63	int main(){
64		int n, m;
65		scanf("%d %d", &n, &m);
66		for (int k = 1; k <= n; ++k){
67			scanf("%d %d", &G[k].r, &G[k].c);
68			for (int i = 1; i <= G[k].r; ++i){
69				for (int j = 1; j <= G[k].c; ++j){
70					scanf("%d", &G[k].A[i][j]);
71				}
72			}
73		}
74		for (int i = 1; i <= m; ++i){
75			int op, x, y;
76			scanf("%d%d%d", &op, &x, &y);
77			if (op == 0){
78				Change(x);
79				Change(y);
80				if (i % 2){
81					print1(x);
82				} else {
83					print2(y);
84				}
85			} else if (op == 1){
86				if (G[x].r != G[y].r || G[x].c != G[y].c){
87					print2("error1");
88					continue;
89				}
90				Add(x, y);
91				print1(x);
92			} else if (op == 2){
93				if (G[x].r != G[y].r || G[x].c != G[y].c){
94					print2("error2");
95					continue;
96				}
97				Subtract(y, x);
98				print1(y);
99			} else {
100				if (G[x].c != G[y].r){
101					print2("error3");
102	 				continue;
103				}
104				Multiply(x, y);
105				print1(x);
106			}
107		}
108		return 0;
109	}
提示:


矩阵转置:将第 $i$ 行 ,变为第 $i$ 列,如:

1 2 3      1 4 7 
4 5 6  ->  2 5 8
7 8 9      3 6 9
矩阵加减法:要保证两个矩阵的行数和列数相同,且相同位置相加减,如:

1 4 7     1 2 3     2   6 10
2 5 6  +  4 5 6  =  6  10 12
3 6 9     7 8 9     10 14 18
矩阵乘法:矩阵$A *$ 矩阵$B=$矩阵$C$,要保证 $A$ 的列数和 $B$ 的行数相同。则$C_{i,j} =\sum_{k=1}^{第i行的数字个数}{A_{i,k} * B_{k,j}$,如:
1 4 7     1 2 3     66  78 90
2 5 6  *  4 5 6  =  64  77 90
3 6 9     7 8 9     90 108 126

1.    T。根据数组的大小判断。

2.    F。第 85 88 行就是预防第 x 和第 y 个矩阵不能相加的情况:两个矩阵存在行数或列数不相等。

3.    T。函数 void Multiply(int a, int b) 的功能是计算第 a 个矩阵乘以第 b 个矩阵的结果。

4.    F。程序借助了 int B[maxn][maxn]; ,因此交换后不影响正确性。

5.    C。根据矩阵相乘的规则,可以确定答案为 C

6.    D。对于操作 0 1 2

矩阵 1 转置后为:

1 4 7
2 5 8
3 6 9
矩阵 2 转置后为:

1 2 3
4 5 6
7 8 9
因为 i = 1,i 为奇数,所以输出矩阵 1

对于操作 1 1 2:

1 4 7       2  6 10
2 5 8  +=   6 10 14
3 6 9      10 12 18

这段代码是对矩阵进行操作:

输入 n 个矩阵,有 m 条操作指令,指令是对 n 个矩阵进行操作,并输出结果。指令格式 op  x  y ,对于第 i(1 i n) 个操作,每个指令的含义为:

l  若 op=0,则将第 x, y 矩阵分别进行转置,如果 i 为奇数则输出第 x 个矩阵,否则输出第 y 个矩阵

l  若 op=1,则第 x 个矩阵 加上第 y 个矩阵,并输出相加后的第 x 个矩阵。如果两个矩阵不能相加,则输出 error1

l  若 op=2,则第 y 个矩阵 减去第 x 个矩阵,并输出相减后的第 y 个矩阵。如果两个矩阵不能相减,则输出 error2

l  若 op=3,则第 x 个矩阵 乘上第 y 个矩阵,并输出相乘后的第 x 个矩阵。如果两个矩阵不能相乘,则输出 error3


Question

1. n, r, c 必须小于 $110$,否则程序可能会发生运行错误。( )

2.(2分)第 $85 \sim 88$ 行不能预防第 $x$ 和第 $y$ 个矩阵不能相加的情况。

3. 如果将第 $41$ 行代码修正,则函数 `void Multiply(int a, int b)` 的功能是计算第 $a$ 个矩阵乘以第 $b$ 个矩阵的结果。( )

4. 第 $10$ 行和第 $11$ 行代码交换位置后,程序运行错误。( )

5. 第 $41$ 行代码是否有误?如果有误,那么正确的代码应该为。( )

6. 若输入:

2 2
3 3
1 2 3
4 5 6
7 8 9
3 3
1 4 7
2 5 6
3 6 9
0 1 2
1 1 2

则正确输出为:

A. 
1 2 3
4 5 6
7 6 9
2 6 10
6 10 14
10 12 18

B. 	
1 4 7 
2 5 8 
3 6 9 
error1

C. 
1 4 7 
2 5 8 
3 6 9 
66 64 90 
78 77 108 
90 90 126

D. 
1 4 7 
2 5 8 
3 6 9 
2 6 10 
6 10 14 
10 12 18