对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
复杂度O(q+mn)O(q+mn)O(q+mn)
2 3 4 2 1 2 3 4 2 3 4 5 3 4 5 6 1 1 2 3 1 10 2 2 2 1 10 10 1 1 1 2 2 1 2
12 13 14 15 1 2 3 4 3 4 5 6 1 10 10 1HintRecommand to use scanf and printf
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <algorithm> #include <set> #define LL long long using namespace std; int A[1010][1010]; int H[1010],L[1010]; int AddH[1010],AddL[1010]; int main() { int n,m,q; int u,x,y; int t; cin>>t; while(t--) { scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) H[i]=i; for(int j=1;j<=m;j++) L[j]=j; memset(AddH,0,sizeof(AddH)); memset(AddL,0,sizeof(AddL)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&A[i][j]); } } while(q--) { scanf("%d%d%d",&u,&x,&y); if(u==1) { swap(H[x],H[y]); swap(AddH[x],AddH[y]); } else if(u==2) { swap(L[x],L[y]); swap(AddL[x],AddL[y]); } else if(u==3) { AddH[x]+=y; } else { AddL[x]+=y; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j!=1) printf(" "); printf("%d",A[H[i]][L[j]]+AddH[i]+AddL[j]); } printf("\n"); } } return 0; }