题目链接:
hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5671
bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=692&pid=1001
题解:
由于都是整行整列操作的,所以可以吧行列分开讨论,最后再一一映射求出变化之后每个点的值。
代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 typedef long long LL;
7 const int maxn = 1010;
8
9 int n, m, q;
10
11 LL mat[maxn][maxn];
12 int x[maxn], y[maxn];
13 LL addx[maxn], addy[maxn];
14 LL ans[maxn][maxn];
15
16 void init() {
17 for (int i = 1; i <= n; i++) {
18 x[i] = i;
19 }
20 for (int j = 1; j <= m; j++) {
21 y[j] = j;
22 }
23 memset(addx, 0, sizeof(addx));
24 memset(addy, 0, sizeof(addy));
25 }
26
27 int main() {
28 int tc;
29 scanf("%d", &tc);
30 while (tc--) {
31 scanf("%d%d%d", &n, &m, &q);
32 init();
33 for (int i = 1; i <= n; i++) {
34 for (int j = 1; j <= m; j++) {
35 scanf("%lld", &mat[i][j]);
36 }
37 }
38 while (q--) {
39 int cmd, xx, yy;
40 scanf("%d%d%d", &cmd, &xx, &yy);
41 if (cmd == 1) {
42 swap(x[xx], x[yy]);
43 swap(addx[xx], addx[yy]);
44 }
45 else if (cmd == 2) {
46 swap(y[xx], y[yy]);
47 swap(addy[xx], addy[yy]);
48 }
49 else if (cmd == 3) {
50 addx[xx] += yy;
51 }
52 else if (cmd == 4) {
53 addy[xx] += yy;
54 }
55 }
56 for (int i = 1; i <= n; i++) {
57 for (int j = 1; j <= m; j++) {
58 ans[i][j] = mat[x[i]][y[j]] + addx[i] + addy[j];
59 }
60 }
61 for (int i = 1; i <= n; i++) {
62 printf("%lld", ans[i][1]);
63 for (int j = 2; j <= m; j++) {
64 printf(" %lld", ans[i][j]);
65 }
66 printf("\n");
67 }
68 }
69 return 0;
70 }