码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-17 10:12:12      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   2014   div   

思路:广搜, 因为空格加上动物最多只有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\n",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\n",ans);
    }
    return 0;
}

 

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

标签:style   blog   color   io   os   ar   for   2014   div   

原文地址:http://www.cnblogs.com/L-Ecry/p/3976428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!