大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵
双向十字链表模拟就行了
const int N = 1500; int n, m, q; struct _ { int v,l,r,u,d; } f[N*N]; int ans[N][N]; int has(int i,int j) {return 1010*(i+2)+(j+2);} int get(int i,int j) { int r = f[has(0,j)].d; REP(k,1,i-1) r=f[r].d; return r; } void pr() { REP(j,1,m) { int x = get(1,j); REP(i,1,n) ans[i][j]=f[x].v,x=f[x].d; } REP(i,1,n) { REP(j,1,m) printf("%d ", ans[i][j]);hr; } } int main() { scanf("%d%d%d", &n, &m, &q); REP(i,1,n) REP(j,1,m) { _ &t = f[has(i,j)]; scanf("%d", &t.v); t.l=has(i,j-1); t.r=has(i,j+1); t.u=has(i-1,j); t.d=has(i+1,j); } REP(i,1,m) { f[has(0,i)].d=has(1,i); f[has(n+1,i)].u=has(n,i); } REP(i,1,n) { f[has(i,m+1)].l=has(i,m); f[has(i,0)].r=has(i,1); } REP(i,1,q) { int a, b, c, d, h, w; scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &h, &w); int x = get(a,b), y = get(c,d); REP(i,1,w) { swap(f[f[x].u].d,f[f[y].u].d); swap(f[x].u,f[y].u); if (i!=w) x = f[x].r, y = f[y].r; } REP(i,1,h) { swap(f[f[x].r].l,f[f[y].r].l); swap(f[x].r,f[y].r); if (i!=h) x = f[x].d, y = f[y].d; } REP(i,1,w) { swap(f[f[x].d].u,f[f[y].d].u); swap(f[x].d,f[y].d); if (i!=w) x = f[x].l, y = f[y].l; } REP(i,1,h) { swap(f[f[x].l].r,f[f[y].l].r); swap(f[x].l,f[y].l); x = f[x].u, y = f[y].u; } } pr(); }