【题目链接】
【算法】
链表,对于每个点,存它的上,下,左,右分别是谁
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
struct node {
int val;
node *l,*r,*u,*d;
} mat[MAXN+10][MAXN+10];
int i,j,x,N,M,Q,A,B,C,D,H,W;
node *pos;
template <typename T> inline void read(T &x) {
int f = 1; x = 0;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
x *= f;
}
template <typename T> inline void write(T x) {
if (x < 0) { x = -x; putchar('-'); }
if (x > 9) write(x/10);
putchar(x%10+'0');
}
template <typename T> inline void writeln(T x) {
write(x);
puts("");
}
inline void modify(int X1,int Y1,int X2,int Y2,int W,int H) {
int i;
node *pos1,*pos2,*tmp1,*tmp2;
pos1 = &mat[X1][0]; pos2 = &mat[X2][0];
for (i = 1; i <= Y1; i++) pos1 = pos1 -> r;
for (i = 1; i <= Y2; i++) pos2 = pos2 -> r;
tmp1 = pos1; tmp2 = pos2;
for (i = 1; i <= W; i++) {
tmp1 -> l -> r = tmp2;
tmp2 -> l -> r = tmp1;
swap(tmp1->l,tmp2->l);
tmp1 = tmp1 -> d; tmp2 = tmp2 -> d;
}
tmp1 = pos1; tmp2 = pos2;
for (i = 1; i < H; i++) tmp1 = tmp1 -> r;
for (i = 1; i < H; i++) tmp2 = tmp2 -> r;
for (i = 1; i <= W; i++) {
tmp1 -> r -> l = tmp2;
tmp2 -> r -> l = tmp1;
swap(tmp1->r,tmp2->r);
tmp1 = tmp1 -> d; tmp2 = tmp2 -> d;
}
tmp1 = pos1; tmp2 = pos2;
for (i = 1; i <= H; i++) {
tmp1 -> u -> d = tmp2;
tmp2 -> u -> d = tmp1;
swap(tmp1->u,tmp2->u);
tmp1 = tmp1 -> r; tmp2 = tmp2 -> r;
}
tmp1 = pos1; tmp2 = pos2;
for (i = 1; i < W; i++) tmp1 = tmp1 -> d;
for (i = 1; i < W; i++) tmp2 = tmp2 -> d;
for (i = 1; i <= H; i++) {
tmp1 -> d -> u = tmp2;
tmp2 -> d -> u = tmp1;
swap(tmp1->d,tmp2->d);
tmp1 = tmp1 -> r; tmp2 = tmp2 -> r;
}
}
int main() {
read(N); read(M); read(Q);
for (i = 0; i <= 1005; i++) {
for (j = 0; j <= 1005; j++) {
mat[i][j].r = &mat[i][j+1];
mat[i][j].d = &mat[i+1][j];
mat[i][j].l = &mat[i][j-1];
mat[i][j].u = &mat[i-1][j];
}
}
for (i = 1; i <= N; i++) {
for (j = 1; j <= M; j++) {
read(x);
mat[i][j].val = x;
}
}
while (Q--) {
read(A); read(B); read(C); read(D); read(H); read(W);
modify(A,B,C,D,H,W);
}
for (i = 1; i <= N; i++) {
pos = mat[i][0].r;
for (j = 1; j <= M; j++) {
write(pos->val);
if (j != M) putchar(' ');
pos = pos -> r;
}
puts("");
}
return 0;
}