题意:
有一个n行m列的矩阵(1≤n≤1000,1≤m≤1000),在这个矩阵上进行q (1≤q≤100,000) 个操作:
1 x y: 交换矩阵M的第x行和第y行(1≤x,y≤n);
2 x y: 交换矩阵M的第x列和第y列((1≤x,y≤m);
3 x y: 对矩阵M的第x行的每一个数加上y(1≤x≤n,1≤y≤10,000);
4 x y: 对矩阵M的第x列的每一个数加上y(1≤x≤m,1≤y≤10,000);
思路:
对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int row[maxn],add_row[maxn],col[maxn],add_col[maxn],mp[maxn][maxn];
int main(){
int _,n,m,q;
scanf("%d",&_);
while(_--){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
for(int i=1;i<=n;i++)
row[i]=i,add_row[i]=0;
for(int i=1;i<=m;i++)
col[i]=i,add_col[i]=0;
int op,x,y;
for(int i=1;i<=q;i++){
scanf("%d%d%d",&op,&x,&y);
if(op==1)
swap(row[x],row[y]),swap(add_row[x],add_row[y]);
if(op==2)
swap(col[x],col[y]),swap(add_col[x],add_col[y]);;
if(op==3)
add_row[x]+=y;
if(op==4)
add_col[x]+=y;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j==m)
printf("%d\n",mp[row[i]][col[j]]+add_row[i]+add_col[j]);
else
printf("%d ",mp[row[i]][col[j]]+add_row[i]+add_col[j]);
}
}
}
return 0;
}