对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1005;
int n, m;
int row[N];
int col[N];
int mat[N][N];
int row_add[N];
int col_add[N];
int main()
{
int T, q, type, x, y;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &q);
memset(row_add, 0, sizeof(row_add));
memset(col_add, 0, sizeof(col_add));
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%d", &mat[i][j]);
col[j] = j;
}
row[i] = i;
}
while(q--)
{
scanf("%d%d%d", &type, &x, &y);
if(type == 1)
{
x--;
y--;
swap(row[x], row[y]);
swap(row_add[x], row_add[y]);
}
else if(type == 2)
{
x--;
y--;
swap(col[x], col[y]);
swap(col_add[x], col_add[y]);
}
else if(type == 3)
{
x--;
row_add[x] += y;
}
else if(type == 4)
{
x--;
col_add[x] += y;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m ;j++)
if(j == 0)
printf("%d", mat[row[i]][col[j]] + row_add[i] + col_add[j]);
else
printf(" %d", mat[row[i]][col[j]] + row_add[i] + col_add[j]);
printf("\n");
}
}
return 0;
}