1 #include <iostream>
2 using namespace std;
3
4 int n, m, q;
5 struct node {
6 int v; // 节点权值
7 int r; // 右侧节点在arr[]中的位置
8 int d; // 下侧节点在arr[]中的位置
9 node() {v = r = d = -1;} // 初始化
10 } arr[1005 * 1005];
11
12 // 利用矩阵行列位置确定在arr[]中的位置
13 int locate(int x, int y)
14 {
15 return x * (m + 1) + y;
16 }
17
18 int main()
19 {
20 ios::sync_with_stdio(false);
21 cin.tie(0);
22
23 cin >> n >> m >> q;
24
25 // 输入权值
26 for (int i = 1; i <= n; i++)
27 for (int j = 1; j <= m; j++)
28 cin >> arr[locate(i, j)].v;
29
30 // 再次遍历确定节点的右侧和下侧 注意是从0开始!
31 for (int i = 0; i <= n; i++) {
32 for (int j = 0; j <= m; j++) {
33 arr[locate(i, j)].r = locate(i, j + 1);
34 arr[locate(i, j)].d = locate(i + 1, j);
35 }
36 }
37
38 // 询问
39 int x1, y1, x2, y2, h, w;
40 while (q--) {
41 cin >> x1 >> y1 >> x2 >> y2 >> h >> w;
42 // 找到两个子矩阵左上角的左上角的位置
43 int p1 = 0, p2 = 0;
44 for (int i = 1; i < x1; i++)
45 p1 = arr[p1].d;
46 for (int i = 1; i < y1; i++)
47 p1 = arr[p1].r;
48 for (int i = 1; i < x2; i++)
49 p2 = arr[p2].d;
50 for (int i = 1; i < y2; i++)
51 p2 = arr[p2].r;
52
53 // 改变子矩阵边界的d、r
54 int r1 = p1, r2 = p2;
55 for (int i = 1; i <= h; i++) {
56 r1 = arr[r1].d;
57 r2 = arr[r2].d;
58 swap(arr[r1].r, arr[r2].r);
59 }
60 for (int i = 1; i <= w; i++) {
61 r1 = arr[r1].r;
62 r2 = arr[r2].r;
63 swap(arr[r1].d, arr[r2].d);
64 }
65 r1 = p1;
66 r2 = p2;
67 for (int i = 1; i <= w; i++) {
68 r1 = arr[r1].r;
69 r2 = arr[r2].r;
70 swap(arr[r1].d, arr[r2].d);
71 }
72 for (int i = 1; i <= h; i++) {
73 r1 = arr[r1].d;
74 r2 = arr[r2].d;
75 swap(arr[r1].r, arr[r2].r);
76 }
77 }
78
79 // 输出改变后的矩阵
80 int p = 0;
81 for (int i = 1; i <= n; i++) {
82 bool flag = true;
83 p = arr[p].d;
84 int k = p;
85 for (int j = 1; j <= m; j++) {
86 k = arr[k].r;
87 if (flag) {
88 cout << arr[k].v;
89 flag = false;
90 }
91 else cout << ' ' << arr[k].v;
92 }
93 cout << endl;
94 }
95 return 0;
96 }