题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941
1 3 3 2 1 1 1 2 2 2 5 3 1 1 1 1 2 2 1 2 3 1 1 3 2 2
Case #1: 1 2 1HintNo two fruits at the same location.
题意:
有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci。之后又q个询问,分三种;
1)1 a b,将a行和b行交换
2)2 a b,将a列和b列交换
3)3 a b,询问(a,b)位置的果树的能量值。
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
    int x, y;
    friend bool operator < (node a, node b)
    {
        //从大到小排列
        if(a.x != b.x)
            return a.x < b.x;
        else
            return a.y < b.y;
    }
};
node pos;
map<int , int>row,col;//分别记录行和列
map<node, int>p;//优先级队列如果插入的节点是结构体类型,则要在结构体中重载比较操作符函数
int main()
{
    int t;
    int n, m, k;
    int x, y, c;
    int op, xx, yy;
    int cas = 0;
    scanf("%d",&t);
    while(t--)
    {
        int c1 = 0, c2 = 0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 0; i < k; i++)
        {
            scanf("%d%d%d",&x, &y, &c);
            if(row[x] == 0)//离散化
                row[x] = ++c1;
            if(col[y] == 0)
                col[y] = ++c2;
            pos.x = row[x];
            pos.y = col[y];
            p[pos] = c;
        }
        int tt, tmp;
        printf("Case #%d:\n",++cas);
        scanf("%d",&tt);
        for(int i = 0; i < tt; i++)
        {
            scanf("%d%d%d",&op,&xx,&yy);
            if(op == 1)
            {
                tmp = row[xx];
                row[xx] = row[yy];
                row[yy] = tmp;
            }
            else if(op == 2)
            {
                tmp = col[xx];
                col[xx] = col[yy];
                col[yy] = tmp;
            }
            else
            {
                pos.x = row[xx];
                pos.y = col[yy];
                printf("%d\n",p[pos]);
            }
        }
    }
    return 0;
}
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
map<int , map<int , int> >mm;
map<int , int> row,col;//分别记录行和列
int main()
{
    int t;
    int n, m, k;
    int x, y, c;
    int op, xx, yy;
    int cas = 0;
    scanf("%d",&t);
    while(t--)
    {
        int c1 = 0, c2 = 0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 0; i < k; i++)
        {
            scanf("%d%d%d",&x, &y, &c);
            if(row[x] == 0)//离散化
                row[x] = ++c1;
            if(col[y] == 0)
                col[y] = ++c2;
            mm[row[x]][col[y]] = c;
        }
        int tt, tmp;
        printf("Case #%d:\n",++cas);
        scanf("%d",&tt);
        for(int i = 0; i < tt; i++)
        {
            scanf("%d%d%d",&op,&xx,&yy);
            if(op == 1)
            {
                tmp = row[xx];
                row[xx] = row[yy];
                row[yy] = tmp;
            }
            else if(op == 2)
            {
                tmp = col[xx];
                col[xx] = col[yy];
                col[yy] = tmp;
            }
            else
            {
                printf("%d\n",mm[row[xx]][col[yy]]);
            }
        }
    }
    return 0;
}
hdu 4941 Magical Forest(STL map & 结构体运用),布布扣,bubuko.com
hdu 4941 Magical Forest(STL map & 结构体运用)
原文地址:http://blog.csdn.net/u012860063/article/details/38519917