• HDU 1429


    http://acm.hdu.edu.cn/showproblem.php?pid=1429

    经典的找钥匙开门走迷宫问题,把钥匙状态压缩一下,然后对迷宫bfs

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    
    int n,m,t;
    int vis[25][25][1<<10];
    
    struct node{
        int x,y,s,step;
    };
    
    char M[25][25];
    int dx[]={1,-1,0,0};
    int dy[]={0,0,1,-1};
    
    int gao(int x,int k){
        return (x>>k)&1;
    }
    
    int bfs(node s){
        queue <node> q;
        q.push(s);
        memset(vis,0,sizeof(vis));
        vis[s.x][s.y][0]=1;
        while(!q.empty()){
            node u=q.front();
            q.pop();
            if(M[u.x][u.y]=='^'){
                return u.step;
            }
            for(int i=0;i<4;i++){
                int xx=u.x+dx[i];
                int yy=u.y+dy[i];
                if(xx<0 || xx>=n || yy<0 || yy>=m)continue;
                if(M[xx][yy]=='*')continue;
                if(M[xx][yy]>='A' && M[xx][yy]<='J' && !(gao(u.s,M[xx][yy]-'A')))continue;
                node next=u;
                if(M[xx][yy]>='a' && M[xx][yy]<='j'){
                    if(!gao(u.s,M[xx][yy]-'a')){
                        next.x=xx;next.y=yy;next.step++;next.s|=(1<<(M[xx][yy]-'a'));
                        if(next.step<t && !vis[xx][yy][next.s]){
                            vis[xx][yy][next.s]=1;
                            q.push(next);
                        }
                    }
                    else{
                        next.x=xx;next.y=yy;next.step++;
                        if(!vis[xx][yy][u.s] && next.step<t){
                            vis[xx][yy][next.s]=1;
                            q.push(next);    
                        }
                    }
                }
                else{
                    next.x=xx;next.y=yy;next.step++;
                    if(next.step<t && !vis[xx][yy][next.s]){
                        vis[xx][yy][next.s]=1;
                        q.push(next);
                    }
                }
            }
        }
        return -1;
    }
    
    int main(){
        while(~scanf("%d%d%d",&n,&m,&t)){
            for(int i=0;i<n;i++)
                scanf("%s",M[i]);
            node s;
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                    if(M[i][j]=='@')
                        s.x=i,s.y=j;
            s.s=0;s.step=0;
            printf("%d
    ",bfs(s));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    MySQL重置密码
    linux下自动备份脚本并上传到ftp服务器
    nginx配置
    WIFI防蹭网
    无线路由知识
    009汇编环境搭建
    008 计算机不会加法
    007计算机不会做加法
    006源码反码补码
    005有符号数和无符号数
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/4116590.html
Copyright © 2020-2023  润新知