hdu 4941 Magical Forest

题目链接:点击打开链接


题意:一块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>

代码:


你可能感兴趣的:(map)