题意:n*m矩阵,q次操作,每次给出两个矩形的左上角坐标,及宽度和高度.交换这两个不相交的矩形.
n,m<=1e3,q<=1e4,输出最后的矩形.
题意限制的很紧,一条直线上不会有属于不同矩形的格子.
n,m<=1e3,q<=1e4,输出最后的矩形.
题意限制的很紧,一条直线上不会有属于不同矩形的格子.
每个格子存其右边和下面元素,交换两个子矩形不改变其内部指针,变得只有其四周一圈的指针O(q*(n+m))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+20;
struct node{
int val;
node *right,*down;
}a[N][N];
int main()
{
int n,m,q;
while(cin>>n>>m>>q)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j].val);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
a[i][j].down=&a[i+1][j];
a[i][j].right=&a[i][j+1];
}
}
int x,y,c,d,h,w;
node *t1,*t2,*p1,*p2;
while(q--)
{
scanf("%d%d%d%d%d%d",&x,&y,&c,&d,&h,&w);
p1=&a[0][0],p2=&a[0][0];
for(int i=0;i<x-1;i++)
p1=p1->down;
for(int i=0;i<y-1;i++)
p1=p1->right;
for(int i=0;i<c-1;i++)
p2=p2->down;
for(int i=0;i<d-1;i++)
p2=p2->right;
t1=p1,t2=p2;
for(int i=0;i<w;i++)
{
t1=t1->right;
t2=t2->right;
swap(t1->down,t2->down);
}
for(int i=0;i<h;i++)
{
t1=t1->down;
t2=t2->down;
swap(t1->right,t2->right);
}
t1=p1;
t2=p2;
for(int i=0;i<h;i++)
{
t1=t1->down;
t2=t2->down;
swap(t1->right,t2->right);
}
for(int i=0;i<w;i++)
{
t1=t1->right;
t2=t2->right;
swap(t1->down,t2->down);
}
}
for(int i=1;i<=n;i++)
{
t1=&a[i][0];
for(int j=1;j<=m;j++)
{
t1=t1->right;
printf("%d ",t1->val);
}
printf("\n");
}
}
return 0;
}