1.1 Joyvan的矩阵

算法设计与分析 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;
		}
	}
}
相关推荐
罗湖老棍子3 分钟前
【例9.18】合并石子(信息学奥赛一本通- P1274)从暴搜到区间 DP:石子合并的四种写法
算法·动态规划·区间dp·区间动态规划
dgaf6 分钟前
【疯狂的往左】用 C 语言播放《下山》
c语言·c++
卷卷的小趴菜学编程8 分钟前
项目篇----仿tcmalloc的内存池设计(central cache篇)
c++·tcmalloc·内存池·central cache
2301_8107301012 分钟前
python第四次作业
数据结构·python·算法
adam_life15 分钟前
区间动态# P1880 [NOI1995] 石子合并】
算法
txinyu的博客16 分钟前
解析muduo源码之 Channel.h & Channel.cc
c++
坠金20 分钟前
递归、递归和回溯的区别
算法
恋爱绝缘体125 分钟前
Java语言提供了八种基本类型。六种数字类型【函数基数噶】
java·python·算法
仰泳的熊猫30 分钟前
题目1434:蓝桥杯历届试题-回文数字
数据结构·c++·算法·蓝桥杯
星火开发设计33 分钟前
格式化输入输出:控制输出精度与对齐方式
开发语言·c++·学习·算法·函数·知识