题目传送门:http://codeforces.com/problemset/problem/706/E
官方题解:http://codeforces.com/blog/entry/46510
#include<iostream> #include<cstdio> using namespace std; const int MAXN = 1000+9; int d[MAXN*MAXN],r[MAXN*MAXN],mat[MAXN*MAXN],m,n,q,vout[MAXN][MAXN]; inline int read(){ char c=getchar(); int ret = 0; while (c<'0'||c>'9') c=getchar(); while (c<='9'&&c>='0') ret = ret*10+c-'0', c=getchar(); return ret; } #define id(x, y) ((x)+1 + (y)*(n+2)) inline void change(int x1, int y1, int x2, int y2, int x, int y){ int p1 = id(0,0), p2 = id(0,0); for (int j=1;j<y1;j++) p1 = d[p1]; for (int i=1;i<=x1;i++) p1 = r[p1]; for (int j=1;j<y2;j++) p2 = d[p2]; for (int i=1;i<=x2;i++) p2 = r[p2]; for (int i=1;i<=x;i++) swap(d[p1], d[p2]), p1 = r[p1], p2 = r[p2]; p1 = id(0,0), p2 = id(0,0); for (int j=1;j<y1+y;j++) p1 = d[p1]; for (int i=1;i<=x1;i++) p1 = r[p1]; for (int j=1;j<y2+y;j++) p2 = d[p2]; for (int i=1;i<=x2;i++) p2 = r[p2]; for (int i=1;i<=x;i++) swap(d[p1], d[p2]), p1 = r[p1], p2 = r[p2]; p1 = id(0,0), p2 = id(0,0); for (int i=1;i<x1;i++) p1 = r[p1]; for (int j=1;j<=y1;j++) p1 = d[p1]; for (int i=1;i<x2;i++) p2 = r[p2]; for (int j=1;j<=y2;j++) p2 = d[p2]; for (int j=1;j<=y;j++) swap(r[p1], r[p2]), p1 = d[p1], p2 = d[p2]; p1 = id(0,0), p2 = id(0,0); for (int i=1;i<x1+x;i++) p1 = r[p1]; for (int j=1;j<=y1;j++) p1 = d[p1]; for (int i=1;i<x2+x;i++) p2 = r[p2]; for (int j=1;j<=y2;j++) p2 = d[p2]; for (int j=1;j<=y;j++) swap(r[p1], r[p2]), p1 = d[p1], p2 = d[p2]; } inline void trans(){ int head = id(0,0); for (int j=1;j<=m;j++) { head = d[head]; for (int i=1,w=r[head];i<=n;i++,w=r[w]) vout[i][j] = mat[w]; } for (int j=1;j<=m;j++) {for (int i=1;i<=n;i++) printf("%d ",vout[i][j]); printf("\n");} } int main(){ m = read(); n = read(); q = read(); for (int j=1;j<=m;j++) for (int i=1;i<=n;i++) mat[id(i,j)] = read(); for (int j=0;j<=m+1;j++) for (int i=0;i<=n+1;i++) d[id(i,j)] = id(i,j+1), r[id(i,j)] = id(i+1,j); for (int k=1,x1,x2,y1,y2,lh,lw;k<=q;k++) { y1 = read(), x1 = read(); y2 = read(), x2 = read(); lh = read(), lw = read(); change(x1,y1,x2,y2,lw,lh); } trans(); return 0; }