本文主要是介绍HDU 4941 Magical Forest,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接~~>
做题感悟:这题开始看时感觉很难,后来发现行和列没关系,属于有想法的一类的题目。
解题思路:
因为所给的数据范围很大,开数组根本开不下,但是一看水果的数量并不大,可以从这里下手。细心观察一下发现行和列是没有关系的,交换行的时候没必要考虑列的感受,反之亦然,这样用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 ;
}
这篇关于HDU 4941 Magical Forest的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!