对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
复杂度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 (转载时请注明本文出处及文章链接)
相关文章
- 本文无相关文章
- 本文无相关文章
发表评论
快来吐槽一下吧!