5A - Matrix

 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 }

猜你喜欢

转载自www.cnblogs.com/AntonLiu/p/10735013.html