题目大意
解题思路
用链表维护每个格子往右往下到那个格子,交换时更改边界连接即可,在原本的行和列之间加入空白列可以简化操作。
code
using namespace std;
int const mn=2000+9,ml=1e7+9,inf=1e9+7;
int n,m,q,f[mn*mn][2],beg[mn*mn],end[mn*mn];
char s[ml],ss[ml];
int get(int x,int y){
int tmp=1;
fo(i,1,x)
tmp=f[tmp][1];
fo(i,1,y)
tmp=f[tmp][0];
return tmp;
}
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
int cnt=0;
fo(i,1,n*2)fo(j,1,m*2-1)f[(i-1)*m*2+j][0]=(i-1)*m*2+j+1;
fo(i,1,n*2-1)fo(j,1,m*2)f[(i-1)*m*2+j][1]=i*m*2+j;
fo(i,1,n)fo(j,1,m){
scanf("%s",ss+1);
int len=strlen(ss+1),tmp=(i*2-1)*m*2+j*2;
beg[tmp]=cnt+1;
fo(k,1,len)s[++cnt]=ss[k];
end[tmp]=cnt;
}
fo(cas,1,q){
int x,y,xx,yy,l,c;
scanf("%d%d%d%d%d%d",&x,&y,&xx,&yy,&l,&c);
int t1=get((x-1)*2,(y-1)*2),t2=f[f[t1][0]][1],
t3=get((xx-1)*2,(yy-1)*2),t4=f[f[t3][0]][1],i,j,k;
for(i=f[t1][0],j=t4,k=1;k<=c*2-1;k++){
f[i][1]=j;
if(k!=c*2-1)i=f[i][0],j=f[j][0];
}
for(i=f[f[i][0]][1],k=1;k<=l*2-1;k++){
f[j][0]=i;
if(k!=l*2-1)i=f[i][1],j=f[j][1];
}
for(i=f[t3][0],j=t2,k=1;k<=c*2-1;k++){
f[i][1]=j;
if(k!=c*2-1)i=f[i][0],j=f[j][0];
}
for(i=f[f[i][0]][1],k=1;k<=l*2-1;k++){
f[j][0]=i;
if(k!=l*2-1)i=f[i][1],j=f[j][1];
}
for(i=f[t1][1],j=t4,k=1;k<=l*2-1;k++){
f[i][0]=j;
if(k!=l*2-1)i=f[i][1],j=f[j][1];
}
for(i=f[f[i][1]][0],k=1;k<=c*2-1;k++){
f[j][1]=i;
if(k!=c*2-1)i=f[i][0],j=f[j][0];
}
for(i=f[t3][1],j=t2,k=1;k<=l*2-1;k++){
f[i][0]=j;
if(k!=l*2-1)i=f[i][1],j=f[j][1];
}
for(i=f[f[i][1]][0],k=1;k<=c*2-1;k++){
f[j][1]=i;
if(k!=c*2-1)i=f[i][0],j=f[j][0];
}
}
fo(i,1,n){
for(int j=(i*2-1)*m*2+1,k=1;k<=m;k++,j=f[j][0]){
j=f[j][0];
fo(k,beg[j],end[j])printf("%c",s[k]);
printf(" ");
}
printf("\n");
}
return 0;
}