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 }
转载于:https://www.cnblogs.com/AntonLiu/p/10735013.html