对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
复杂度O(q+mn)O(q+mn)O(q+mn)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int a[1010][1010];
int n, m, q;
int row[1010], col[1010], rs[1010], cs[1010];
int main() {
int t;
scanf("%d", &t);
while (t--) {
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]);
}
}
for (int i = 1; i <= n; ++i) {
row[i] = i;
rs[i] = 0;
}
for (int i = 1; i <= m; ++i) {
col[i] = i;
cs[i] = 0;
}
int op, x, y;
while (q--) {
scanf("%d%d%d", &op, &x, &y);
if (op == 1) {
swap(row[x], row[y]);
} else if (op == 2) {
swap(col[x], col[y]);
} else if (op == 3) {
rs[row[x]] += y;
} else if (op == 4) {
cs[col[x]] += y;
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
int tmp = a[row[i]][col[j]];
tmp += rs[row[i]];
tmp += cs[col[j]];
printf(j == 1 ? "%d" : " %d", tmp);
}
puts("");
}
}
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/861 (转载时请注明本文出处及文章链接)
相关文章
- 本文无相关文章
- 本文无相关文章


发表评论
快来吐槽一下吧!