题目链接:点击打开链接
题意:一块n*m的土地上有的一些地方有水果,有三种操作,交换两行,交换两列,查询某一点有没有水果。
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; map <int,int >row; map <int,int > col; map <pair<int,int>,int> res; void init(){ row.clear(); col.clear(); res.clear(); } int main(){ int T; int cas=1; cin>>T; while(T--){ init(); printf("Case #%d:\n",cas++); int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); row[a]=a; col[b]=b; res[make_pair(a,b)]=c; } int t; scanf("%d",&t); for(int i=1;i<=t;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a==1){ int t1=row[b]; int t2=row[c]; row[b]=t2; row[c]=t1; } else if(a==2){ int t1=col[b]; int t2=col[c]; col[b]=t2; col[c]=t1; } else printf("%d\n",res[make_pair(row[b],col[c])]); } } return 0; }
本题数据范围是2*10^9,开数组开不下,想到用map,map不需要预先开空间,而且默认值是0,所以很适合这题。
开3个map数组,一个行的,一个列的(行列交换互不影响),一个表示结果的。row[ n ]表示n这一行当前在哪行,其他同理。
输入水果坐标时将这坐标的行和列数组初始为自身。
因为本题交换只会发生在两行有水果的或两行没水果的之间,如果是有水果的,那么输入时已经初始化了这两行,可正常交换。如果是没水果的,则两个位置的行数组中的数都是0,最后输出的结果也是0,不影响。
具体看代码:
res数组的形式是< pair<int,int> ,int> >,调用的时候要用make_pair<int, int>
代码: