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 }
标签:p2,arr,p1,Matrix,int,++,5A,节点 来源: https://www.cnblogs.com/AntonLiu/p/10735013.html