首页 > 代码库 > [HDU]5094Maze(状态压缩BFS)

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

状态压缩的题,第一次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;
}

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