Description
Input
Output
Sample Input
4 4 2
a a b b
a a b b
c c d d
c c d d
1 1 3 3 2 2
3 1 1 3 2 2
Sample Output
d d c c
d d c c
b b a a
b b a a
Data Constraint
Solution
一道模拟题,但是交换矩阵不能暴力交换——时间不允许。
于是用四向链表维护一个点的四个方向的点是什么,
交换时维护矩阵边缘的点的指针即可。
注意: 读入的字符串长度可能长短不一,开三维数组存会爆内存,用一个 Vector 存即可。
Code
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1002;
struct data
{
int v,u,d,l,r;
}a[N*N];
int tot;
int f[N][N];
vector<int>s[N*N];
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
int main()
{
int n=read(),m=read(),q=read();
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)
{
f[i][j]=i*(m+2)+j;
if(i>=1 && i<=n && j>=1 && j<=m)
{
char ch=getchar();
while(!(ch>='a' && ch<='z')) ch=getchar();
while(ch>='a' && ch<='z') s[f[i][j]].push_back(ch),ch=getchar();
}
a[f[i][j]].u=f[i-1][j];
a[f[i-1][j]].d=f[i][j];
a[f[i][j]].l=f[i][j-1];
a[f[i][j-1]].r=f[i][j];
a[f[i][j]].v=f[i][j];
}
}
while(q--)
{
int x1=read(),y1=read();
int x2=read(),y2=read();
int l=read(),c=read();
int z1=a[1].d,z2=a[1].d;
for(int i=2;i<=x1;i++) z1=a[z1].d;
for(int i=2;i<=y1;i++) z1=a[z1].r;
for(int i=2;i<=x2;i++) z2=a[z2].d;
for(int i=2;i<=y2;i++) z2=a[z2].r;
for(int i=0,x=a[z1].l,y=a[z2].l;i<l;i++,x=a[x].d,y=a[y].d) swap(a[x].r,a[y].r);
for(int i=0,x=a[z1].u,y=a[z2].u;i<c;i++,x=a[x].r,y=a[y].r) swap(a[x].d,a[y].d);
int p=a[z1].l,q=a[z2].l;
for(int i=1;i<=c;i++) p=a[p].r,q=a[q].r;
for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].r,a[q].r);
p=a[z1].u,q=a[z2].u;
for(int i=1;i<=l;i++) p=a[p].d,q=a[q].d;
for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].d,a[q].d);
p=z1,q=z2;
for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].l,a[q].l);
p=z1,q=z2;
for(int i=1;i<=c;i++) p=a[p].r,q=a[q].r;
for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].l,a[q].l);
p=z1,q=z2;
for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].u,a[q].u);
p=z1,q=z2;
for(int i=1;i<=l;i++) p=a[p].d,q=a[q].d;
for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].u,a[q].u);
}
for(int i=a[1].d,p=1;p<=n;p++,i=a[i].d,putchar('\n'))
for(int j=i,q=1;q<=m;q++,j=a[j].r,putchar(' '))
for(int k=0;k<s[j].size();k++) putchar(s[j][k]);
return 0;
}