题目传送门:http://codeforces.com/problemset/problem/706/E
思路:用十字链表存矩阵,然后枚举题意就好了
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <bitset>
#include <cstdlib>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define ull unsigned long long
#define mem(n,v) memset(n,v,sizeof(n))
#define MAX 1005
#define MAXN 10005
#define PI 3.1415926
#define E 2.718281828459
#define opnin freopen("input.txt","r",stdin)
#define opnout freopen("output.txt","w",stdout)
#define clsin fclose(stdin)
#define clsout fclose(stdout)
#define haha1 cout << "haha1"<< endl
#define haha2 cout << "haha2"<< endl
#define haha3 cout << "haha3"<< endl
const int INF = 0x3f3f3f3f;
const ll INFF = 0x3f3f3f3f3f3f3f3f;
const double pi = 3.141592653589793;
const double inf = 1e18;
const double eps = 1e-8;
const ll mod = 1e18;
const ull mx = 133333331;
/**************************************************************************/
int mtx[MAX][MAX];
int id[MAX][MAX];
int val[MAX*MAX];
int r[MAX*MAX];
int down[MAX*MAX];
void init()
{
mem(mtx,0);
mem(id,0);
mem(val,0);
mem(r,0);
mem(down,0);
}
void makemtx(int m,int n)
{
int cnt = 0;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
id[i][j] = ++cnt;
val[cnt] = mtx[i][j];
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(j) r[id[i][j-1]] = id[i][j];
if(i) down[id[i-1][j]] = id[i][j];
}
}
}
int mov(int mark,int x,int y)
{
while(x){
mark = down[mark];
x--;
}
while(y){
mark = r[mark];
y--;
}
return mark;
}
void swapmtx(int a,int b,int c,int d,int h,int w)
{
int mark1x = mov(1,a-1,b);
int mark1y = mov(1,c-1,d);
int mark2x = mov(1,a,b+w-1);
int mark2y = mov(1,c,d+w-1);
int mark3x = mov(1,a+h-1,b);
int mark3y = mov(1,c+h-1,d);
int mark4x = mov(1,a,b-1);
int mark4y = mov(1,c,d-1);
for(int i=1;i<=w;i++){
swap(down[mark1x],down[mark1y]);
mark1x = r[mark1x];
mark1y = r[mark1y];
}
for(int i=1;i<=h;i++){
swap(r[mark2x],r[mark2y]);
mark2x = down[mark2x];
mark2y = down[mark2y];
}
for(int i=1;i<=w;i++){
swap(down[mark3x],down[mark3y]);
mark3x = r[mark3x];
mark3y = r[mark3y];
}
for(int i=1;i<=h;i++){
swap(r[mark4x],r[mark4y]);
mark4x = down[mark4x];
mark4y = down[mark4y];
}
}
void printmtx(int n,int m)
{
int j = 1;
for(int i=1;i<=n;i++){
j = down[j];
int tempm = m;
int tempj = j;
// cout << "tempj: " << tempj << endl;
while(tempm--){
tempj = r[tempj];
printf("%d ",val[tempj]);
}
cout << endl;
}
}
int main()
{
init();
int n,m,q;
cin >> n >> m >> q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&mtx[i][j]);
}
}
makemtx(m,n);
int a,b,c,d,h,w;
for(int i=0;i<q;i++){
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&h,&w);
swapmtx(a,b,c,d,h,w);
}
printmtx(n,m);
return 0;
}