题目链接:点击打开链接
题意:一块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>
代码: