题目链接~~>
做题感悟:这题开始看时感觉很难,后来发现行和列没关系,属于有想法的一类的题目。
解题思路:
因为所给的数据范围很大,开数组根本开不下,但是一看水果的数量并不大,可以从这里下手。细心观察一下发现行和列是没有关系的,交换行的时候没必要考虑列的感受,反之亦然,这样用map 离散化一下,然后用双重map 标记一个水果的位置,交换的时候只交换映射的值就可以了,其实原先的坐标还对应相应的水果。
代码:
#include<iostream> #include<fstream> #include<iomanip> #include<ctime> #include<fstream> #include<sstream> #include<stack> #include<cstring> #include<cmath> #include<map> #include<vector> #include<cstdio> #include<algorithm> #define INT long long int using namespace std ; const double esp = 0.00000001 ; const int INF = 1000000000 ; const int MY = 20 ; const int MX = (1<<17) + 10 ; map<int ,int >row ; map<int ,int >col ; map<int ,map<int ,int > >m ; void input() { int nx ,mx ,k ,x ,y ,c ; row.clear() ; col.clear() ; m.clear() ; scanf("%d%d%d",&nx ,&mx ,&k) ; int rl = 1 ,cl = 1 ; for(int i = 0 ;i < k ;i++) { scanf("%d%d%d" ,&x ,&y ,&c) ; if(!row[x]) row[x] = rl++ ; if(!col[y]) col[y] = cl++ ; m[row[x]][col[y]] = c ; } } void solve() { int T ,temp ,a ,b ,c ; scanf("%d" ,&T) ; while(T--) { scanf("%d%d%d" ,&a ,&b ,&c) ; if(a == 1) { temp = row[b] ; row[b] = row[c] ; row[c] = temp ; } else if(a == 2) { temp = col[b] ; col[b] = col[c] ; col[c] = temp ; } else if(a == 3) cout<<m[row[b]][col[c]]<<endl ; } } int main() { int Tx,cse=1 ; scanf("%d",&Tx) ; while(Tx--) { input() ; cout<<"Case #"<<cse++<<":"<<endl ; solve() ; } return 0 ; }