题意:
官方题解:对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
小技巧:不用真正换,用中间变量记载过程!
#include<bits/stdc++.h>
using namespace std;
long long a[1010][1010],bx[1010],by[1010],ax[1010],ay[1010];
int main()
{
int T;scanf("%d",&T);
while(T--){
int n,m,q;scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++) bx[i]=i;
for(int i=1;i<=m;i++) by[i]=i;
memset(ax,0,sizeof(ax));
memset(ay,0,sizeof(ay));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%lld",&a[i][j]);
}
}
for(int i=0;i<q;i++){
int c,x,y;scanf("%d%d%d",&c,&x,&y);
if(c==1) swap(bx[x],bx[y]),swap(ax[x],ax[y]);
else if(c==2) swap(by[x],by[y]),swap(ay[x],ay[y]);
else if(c==3) ax[x]+=y;
else if(c==4) ay[x]+=y;
}
for(int i=1;i<=n;i++){
int ok=1;
for(int j=1;j<=m;j++){
if(ok) ok=0;
else printf(" ");
printf("%lld",a[bx[i]][by[j]]+ax[i]+ay[j]);
}
printf("\n");
}
}
}