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 ;
}
文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nyist_zxp/article/details/38610351
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)