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;



}

 

你可能感兴趣的:(poj)