Matrix
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 502 Accepted Submission(s):
215
Problem Description
There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000).Then we perform q(1≤q≤100,000) operations:
1 x y: Swap row x and row y (1≤x,y≤n) ;
2 x y: Swap column x and column y (1≤x,y≤m) ;
3 x y: Add y to all elements in row x (1≤x≤n,1≤y≤10,000) ;
4 x y: Add y to all elements in column x (1≤x≤m,1≤y≤10,000) ;
Input
There are multiple test cases. The first line of input
contains an integer T(1≤T≤20) indicating the number of test cases. For each test case:
The first line
contains three integers n , m and q .
The following n lines describe the matrix M.(1≤M,i,j≤10,000) for all (1≤i≤n,1≤j≤m) .
The following q lines contains three integers a(1≤a≤4) , x and y .
Output
For each test case, output the matrix M after all q operations.
Sample Input
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
Sample Output
12 13 14 15
1 2 3 4
3 4 5 6
1 10
10 1
Hint
Recommand to use scanf and printf
Recommend
wange2014
题目大意:有一个n行m列的矩阵,在这个矩阵上进行q个操作,输出经过所有q个操作以后的矩阵M
思路:用4个数组,对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。
注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
#include <iostream> #include <string.h> using namespace std; int h[1010],l[1010], zh[1010], zl[1010]; int a[1010][1010]; int main() { int T, n, m, q, i, j, c, x, y, t; cin>>T; while(T--) { memset(zh,0,sizeof(zh)); memset(zl,0,sizeof(zl)); for(i=1;i<=1005;i++) h[i]=l[i]=i; scanf("%d%d%d", &n, &m, &q); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d", &a[i][j]); while(q--) { scanf("%d%d%d", &c, &x, &y); if(c==1) {t=h[x];h[x]=h[y];h[y]=t;} else if(c==2) {t=l[x];l[x]=l[y];l[y]=t;} else if(c==3) zh[h[x]] += y; else if(c==4) zl[l[x]] += y; } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) if(j==1) printf("%d", a[h[i]][l[j]]+zh[h[i]]+zl[l[j]]); else printf(" %d", a[h[i]][l[j]]+zh[h[i]]+zl[l[j]]); printf("\n"); } } return 0; }