矩阵处理,记录好每行与列在原来的位置即可
设原来的第i行现在在第x[i]行,原来的第i列现在在第y[i]列
xd[i]表示第i行需要增加的值,yd[i]表示第i列需要增加的值
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1005;
int n,m,q;
int a[maxn][maxn];
int x[maxn],y[maxn],xd[maxn],yd[maxn];
int main()
{
int t; scanf("%d",&t);
while(t--){
for(int i=1;i<maxn;++i){
x[i]=y[i]=i;
xd[i]=yd[i]=0;
}
scanf("%d %d %d",&n,&m,&q);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) scanf("%d",&a[i][j]);
int t1,t2,t3;
while(q--){
scanf("%d %d %d",&t1,&t2,&t3);
switch(t1){
case 1:
swap(x[t2],x[t3]);
break;
case 2:
swap(y[t2],y[t3]);
break;
case 3:
xd[x[t2]]+=t3;
break;
case 4:
yd[y[t2]]+=t3;
break;
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(j!=1) printf(" ");
printf("%d",a[x[i]][y[j]]+xd[x[i]]+yd[y[j]]);
}
printf("\n");
}
}
}