这题直接用枚举是要TLE的,关键步骤
是要用4个数组来存下变化的行数,列数,行数增加的数与列数
增加的数,最后输出是就通过这个4个数组作导索来输出数据
还有一点就是交换行,列数 数组时要记得交换行,列增加数 数组
时间复杂度为:O(q+m*n)
代码如下:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>
#include <cmath>
using namespace std;
int data[1005][1005];
int exha[1005],exli[1005];
int hajia[1005],lijia[1005];
int main(){
#ifdef DID
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--){
memset(data,0,sizeof(data));
memset(exha,0,sizeof(exha));
memset(exli,0,sizeof(exli));
memset(hajia,0,sizeof(hajia));
memset(lijia,0,sizeof(lijia));
int n,m,q,num,x,y;
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i<n;i++){
exha[i]=i;
for(int j=0;j<m;j++)
scanf("%d",&data[i][j]);
}
for(int j=0;j<m;j++)
exli[j]=j;
for(int i=0;i<q;i++){
scanf("%d%d%d",&num,&x,&y);
if(num==1){
swap(exha[x-1],exha[y-1]); //记录交换的行数
swap(hajia[x-1],hajia[y-1]); //交换行增加数的数组
}
else if(num==2){
swap(exli[x-1],exli[y-1]); //与上同理
swap(lijia[x-1],lijia[y-1]);
}
else if(num==3)
hajia[x-1]+=y;
else
lijia[x-1]+=y;
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
int x1=exha[i],y1=exli[j]; //x1为对应原数组的行,y1对应原数组的列
int addha=hajia[i],addli=lijia[j]; //对应行,列增加数
int num=data[x1][y1]+addha+addli; //输出数据
if(j!=m-1)
printf("%d ",num);
else
printf("%d\n",num);
}
}
return 0;
}