算法设计与分析 1.1 Joyvan的矩阵
题目描述
Joyvan有一个大小为n * m的矩阵,现在他要对矩阵进行q次操作,操作分为如下三种:
0 x y:交换矩阵的x、y两行。
1 x y:交换矩阵的x、y两列。
2 x y:求当前矩阵第x行第y列的元素。
输入格式
第一行三个正整数n、m、q,表示矩阵大小和操作次数。
接下来n行,每行m个空格隔开的整数,表示矩阵的元素。
接下来q行,每行三个数op、x、y,表示上述操作中的一种。
对于80%的数据,1 <= n、m、q <= 1000。
对于100%的数据,1 <= n、m <= 1000,1 <= q <= 1000000,矩阵元素大小在int范围内且非负。
输出格式
对于操作2,输出一个整数,表示对应的元素。
样例输入
cpp
2 2 6
1 2
3 4
0 1 2
1 1 2
2 1 1
2 1 2
2 2 1
2 2 2
样例输出
cpp
4
3
2
1
提示
输入规模较大,请使用scanf/printf。
参考代码
cpp
#include <iostream>
#define swap(a,b) { int t=a;a=b;b=t;}
/*
存储矩阵A;
申请行数组R和列数组C,初始赋值为1,2,3,---,n(m)
交换行x和行y ------ swap(R[x],R[y]);
交换列x和列y ------ swap(C[x],C[y]);
输出第x行第y列的元素 ------输出A[R[x]][C[y]];
*/
int main() {
int n,m,q,op,x,y;
scanf("%d %d %d", &n, &m, &q);
int A[n+1][m+1],R[n+1],C[m+1];
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d", &A[i][j]);
C[j]=j;
}
R[i]=i;
}
for(int i=0; i<q; i++) {
scanf("%d %d %d", &op, &x, &y);
switch(op) {
case 0:
swap(R[x],R[y]);
break;
case 1:
swap(C[x],C[y]);
break;
case 2:
printf("%d\n", A[R[x]][C[y]]);
break;
}
}
}