[HDU]5094Maze(状态压缩BFS)

来源:互联网 发布:淘宝上哪家大码女装好 编辑:程序博客网 时间:2024/05/18 15:04

状态压缩的题,第一次WA了,怎么改都不对,交了十几遍,之后重新写了一个,1A了

#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn = 51;const int dir[4][2] = {{0,1},{-1,0},{0,-1},{1,0}};int n,m,t;int door[maxn][maxn][4];int key[maxn][maxn];int vis[maxn][maxn][(1 << 11)];struct St{    int x,y,key,step;}now;void init(){    memset(key,0,sizeof(key));    memset(door,-1,sizeof(door));//-1代表可以任意的通过    memset(vis,0,sizeof(vis));}void add_door(int x1,int y1,int x2,int y2,int op){    if(x1 == x2){        if(y1 > y2){            door[x1][y1][2] = (1 << op);            door[x2][y2][0] = (1 << op);        }        else{            door[x1][y1][0] = (1 << op);            door[x2][y2][2] = (1 << op);        }    }    else{        if(x1 > x2){            door[x1][y1][1] = (1 << op);            door[x2][y2][3] = (1 << op);        }        else{            door[x1][y1][3] = (1 << op);            door[x2][y2][1] = (1 << op);        }    }}bool judge(int d){    if(door[now.x][now.y][d] == -1) return true;    //可以直接通过    if(door[now.x][now.y][d] ==  1) return false;   //是一面墙    int op = door[now.x][now.y][d]&now.key;    if(!op) return false;    return true;}void dfs(){    now.x = 1; now.y = 1; now.key = key[1][1]; now.step = 0;    vis[now.x][now.y][now.key] = 1;    queue<St>q;    while(!q.empty()) q.pop();    q.push(now);    while(!q.empty()){        now = q.front(); q.pop();        //printf("%d %d\n",now.x,now.y);;        if(now.x == n && now.y == m){            printf("%d\n",now.step);            return;        }        for(int d = 0; d < 4; d++){            int x = now.x + dir[d][0];            int y = now.y + dir[d][1];            if(x >= 1 && x <= n && y >= 1 && y <= m){                if(!judge(d)) continue;                int c_key = now.key|key[x][y];                if(!vis[x][y][c_key]){                    St temp; temp.x = x; temp.y = y; temp.key = c_key;                    temp.step = now.step + 1;                    q.push(temp);                    vis[x][y][c_key] = 1;                }            }        }    }    printf("-1\n");}int main(){    while(scanf("%d%d%d",&n,&m,&t) != EOF){        int a,b;        init();        scanf("%d",&a);        for(int i = 0; i < a; i++){            int x1,y1,x2,y2,op;            scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&op);            add_door(x1,y1,x2,y2,op);        }        scanf("%d",&b);        for(int i = 0; i < b; i++){            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            key[x][y] |= (1 << z); //一个坐标的钥匙,状态压缩        }        dfs();    }    return 0;}

0 0