poj1324Holedox Moving搜索

  刚开始想 stl水过去 ,一直超时。坑的是 这题贪吃蛇,头不能向尾部移动,后来手跑了样例才发现。。

二进制位压判重,然后就普通的bfs 搞。对于那些30ms 过的很ym。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
int n, m, l;
bool vis[21][21][1 << 14];
int dis[40][40];
int Map[40][40];
const int maxn = 1111111;
int xxx[maxn]; int yyy[maxn]; int st[maxn];
int q[maxn];

int gao(int state, int x, int y, int x2, int y2)
{
    int xiaojiji;
    if (x2 >= 1 && x2 <= n&&y2 >= 1 && y2 <= m&&!Map[x2][y2]) xiaojiji = 1; else return 0;
    int x1 = x; int y1 = y;
    for (int i = 0; i < l - 1; i++){
        int pos = i * 2; int a = state&(1 << pos); int b = state&(1 << (pos + 1));
        if (a) a = 1; if (b) b = 1;
        int t = b * 2 + a;
        x1 = x1 + dx[t]; y1 = y1 + dy[t];
        if (x1 == x2&&y1 == y2) return 0;
    }
    return 1;
}
int gao1(int state, int x, int y, int x2, int y2)
{
    int gg = state;
    gg &= ~(1 << ((l - 1) * 2 - 1));
    gg &= ~(1 << ((l - 1) * 2 - 2));
    gg <<= 2;
    if (x - x2 == 1) gg |= 1;
    if (y - y2 == -1) gg |= 2;
    if (y - y2 == 1) gg |= 1, gg |= 2;
    return gg;
}
int gaomaoxian(int x, int y, int state)
{
    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    vis[x][y][state] = 1;
    int l = 0, r = 0; int ans = 0;
    xxx[ans] = x; yyy[ans] = y; st[ans] = state;
    q[r++] = ans++;
    while (l<r){
        int cur = q[l++]; int xx = xxx[cur]; int yy = yyy[cur]; int state1 = st[cur];
        if (xx == 1 && yy == 1) return dis[xx][yy];
        for (int i = 0; i < 4; i++){
            int x1 = xx + dx[i]; int y1 = yy + dy[i];
            if (!gao(state1, xx, yy, x1, y1)) continue;
            int state2 = gao1(state1, xx, yy, x1, y1);
            if (vis[x1][y1][state2]) continue;
            xxx[ans] = x1; yyy[ans] = y1; st[ans] = state2;
            q[r++] = ans++;
            vis[x1][y1][state2] = 1;
            dis[x1][y1] = dis[xx][yy] + 1;
        }
    }
    return -1;
}
int main()
{
    int x, y, a, b, state, k;
    int Icase = 0;
    while (scanf("%d%d%d", &n, &m, &l), n || m || l){
        scanf("%d%d", &x, &y);
        int a1 = x; int b1 = y; state = 0;
        for (int i = 0; i < l - 1; i++){
            scanf("%d%d", &a, &b);
            int pos = i * 2;
            if (a - a1 == 1) state |= (1 << pos);
            if (b - b1 == -1) state |= (1 << (pos + 1));
            if (b - b1 == 1) state |= (1 << pos), state |= (1 << (pos + 1));
            a1 = a; b1 = b;
        }
        cin >> k;
        memset(Map, 0, sizeof(Map));
        for (int i = 0; i<k; i++){
            scanf("%d%d", &a, &b);
            Map[a][b] = 1;
        }
        printf("Case %d: ", ++Icase);
        printf("%d\n", gaomaoxian(x, y, state));
    }
    return 0;

}

 

posted on 2014-08-28 20:52  一个西瓜  阅读(243)  评论(0编辑  收藏  举报

导航