• HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)


    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示。

    接下去每次就是模拟了。  

    注意:  ‘S’ 不是只有一个。

               一个东西如果不是'P'在动的话要先判断周围有没有‘P’,有的话要先吃掉

            'P'在动的时候如果一个位置周围有多个东西,都要吃掉。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    #include<time.h>
    #include<string>
    #define REP(i,n) for(int i=0;i<n;++i)
    #define REP1(i,a,b) for(int i=a;i<=b;++i)
    #define REP2(i,a,b) for(int i=a;i>=b;--i)
    #define MP make_pair
    #define LL long long
    #define ULL unsigned long long
    #define X first
    #define Y second
    #define MAXN 1000050
    using namespace std;
    map<ULL, int> mp;
    int dx[] = { 0, 0, 1, -1 };
    int dy[] = { 1, -1, 0, 0 };
    char s[6][9];
    int id[6][9];
    int qx[100];
    int qy[100];
    int qcnt;
    ULL q[MAXN];
    ULL bas[100];
    struct node {
        char a[6][9];
        int scnt;
        node() {
        }
        ;
        node(ULL now) {
            scnt = 0;
            REP(i,6)
                REP(j,8)
                    a[i][j] = s[i][j];
            REP(i,qcnt)
            {
                ULL k = now & 3;
                now >>= 2;
                if (k == 0)
                    continue;
                if (k == 1) {
                    a[qx[i]][qy[i]] = 'S';
                    scnt++;
                }
                if (k == 2)
                    a[qx[i]][qy[i]] = 'M';
                if (k == 3)
                    a[qx[i]][qy[i]] = 'P';
            }
        }
    
        void debug(){
            puts("-------");
            REP(i,6)
            {
                REP(j,8)putchar(a[i][j]);
                puts("");
            }
            puts("------------------");
        }
    };
    
    void init() {
        qcnt = 0;
        int cid = 0;
        memset(id, -1, sizeof(id));
        REP(i,6)
            REP(j,8)
            {
                if (s[i][j] == '#' || s[i][j] == 'N')
                    continue;
                qx[qcnt] = i;
                qy[qcnt++] = j;
                id[i][j] = cid++;
            }
    }
    
    ULL geths(char s[6][9]) {
        ULL ans = 0;
        REP(i,6)
            REP(j,8)
            {
                if (s[i][j] == 'S') {
                    ans += bas[id[i][j] << 1];
                    continue;
                }
                if (s[i][j] == 'M') {
                    ans += 2 * bas[id[i][j] << 1];
                    continue;
                }
                if (s[i][j] == 'P') {
                    ans += 3 * bas[id[i][j] << 1];
                }
            }
        return ans;
    }
    
    bool check(int x, int y) {
        if (x < 0 || x >= 6 || y < 0 || y >= 8)
            return false;
        return true;
    }
    
    node move(node a, int x, int y, int dxx, int dyy, int &p) {
        char c = a.a[x][y];
        while (true) {
            int xx = x + dxx;
            int yy = y + dyy;
            if ((!check(xx, yy)) || a.a[xx][yy] != '.') {
                p = 1;
                return a;
            }
            a.a[xx][yy] = a.a[x][y];
            a.a[x][y] = '.';
            if (c == 'P') {
                int flag=0;
                for (int j = 0; j < 4; ++j) {
                    int px = xx + dx[j];
                    int py = yy + dy[j];
                    if (!check(px, py))
                        continue;
                    if (a.a[px][py] == 'N') {
                        p = 0;
                        return a;
                    }
                    if (a.a[px][py] == 'S' || a.a[px][py] == 'M') {
                        if (a.a[px][py] == 'S') {
                            a.scnt--;
                            if (a.scnt == 0) {
                                p = 0;
                                return a;
                            }
                        }
                        a.a[px][py] = '.';
                        flag=1;
                    }
                }
                if(flag)
                {
                    p=1;
                    return a;
                }
            } else {
                for (int i = 0; i < 4; ++i) {
                    int px = xx + dx[i];
                    int py = yy + dy[i];
                    if (!check(px, py))
                        continue;
                    if (a.a[px][py] == 'P') {
                        if (c == 'S') {
                            a.scnt--;
                            if (a.scnt == 0) {
                                p = 0;
                                return a;
                            }
                        }
                        a.a[xx][yy] = '.';
                        p = 1;
                        return a;
                    }
                }
    
                for (int i = 0; i < 4; ++i) {
                    int px = xx + dx[i];
                    int py = yy + dy[i];
                    if (!check(px, py))
                        continue;
                    if (a.a[px][py] == 'N') {
                        if (c == 'S') {
                            p = 2;
                            return a;
                        }
                        p = 0;
                        return a;
                    }
                }
            }
            x = xx;
            y = yy;
        }
        return a;
    }
    int d[MAXN];
    int bfs(ULL st) {
        int tail = 0;
        d[0] = 0;
        q[tail++] = st;
        mp.clear();
        mp[st] = 1;
        for (int i = 0; i < tail; ++i) {
            node a = node(q[i]);
            REP(j,6)
                REP(k,8)
                {
                    if (a.a[j][k] == 'S' || a.a[j][k] == 'M' || a.a[j][k] == 'P') {
                        for (int x = 0; x < 4; ++x) {
                            int p;
                            node e = move(a, j, k, dx[x], dy[x], p);
                            if (p == 2) {
                                return d[i] + 1;
                            }
                            if (p == 1) {
                                ULL hs = geths(e.a);
    
                                if (mp.find(hs) == mp.end()) {
                                    mp[hs] = 1;
                                    q[tail] = hs;
                                    d[tail++] = d[i] + 1;
                                }
                            }
                        }
                    }
                }
        }
        printf("tail:%d
    ",tail);
        return -1;
    }
    
    int main() {
    //    freopen("1.txt","w",stdout);
        bas[0] = 1;
        for (int i = 1; i <= 64; ++i)
            bas[i] = bas[i - 1] * 2;
        while(scanf(" %s",s[0])!=EOF){
            for(int i=1;i<6;++i)scanf(" %s",s[i]);
            init();
            ULL hs=geths(s);
            REP(i,6)REP(j,8)if(s[i][j]=='S'||s[i][j]=='M'||s[i][j]=='P')s[i][j]='.';
            int ans=bfs(hs);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    java课程之团队开发冲刺阶段1.10
    java课程之团队开发冲刺阶段1.9
    java课程之团队开发之用户模板和用户场景
    大二第二学期周学习进度总结(八)
    java课程之团队开发冲刺阶段1.8
    java课程课后作业190425之一维数组最大子数组—功能扩展(界面实现)
    java课程之团队开发冲刺阶段1.7
    java课程之团队开发冲刺阶段1.6
    Python函数-高级(闭包/装饰器)
    Python之函数
  • 原文地址:https://www.cnblogs.com/L-Ecry/p/3976428.html
Copyright © 2020-2023  润新知