• hdu1429胜利大逃亡(bfs)


    胜利大逃亡(续)

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 9204    Accepted Submission(s): 3327


    Problem Description
    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……

    这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
     
    Input
    每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

    . 代表路
    * 代表墙
    @ 代表Ignatius的起始位置
    ^ 代表地牢的出口
    A-J 代表带锁的门,对应的钥匙分别为a-j
    a-j 代表钥匙,对应的门分别为A-J

    每组测试数据之间有一个空行。
     
    Output
    针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
     
    Sample Input
    4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
     
    Sample Output
    16 -1
     
    Author
    LL
     
    Source
     
    /*
    把这10把钥匙当成每一个为,要要1<<10个位保存所有的状态,
    然后就是模拟捡起钥匙,捡起钥匙就是说明这个位上的数字变成1这个状态,
    只要|一下就好了,然后改变在这个点的状态。。。。模拟碰到门的情况,
    那么就和这个位置上的位&一次,看是1还是0,1代表已经捡到了这把钥匙,可以开门
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    
    #define N 30
    
    using namespace std;
    char map[N][N],str[N];;
    int n,m,t;
    bool vis[N][N][(1<<11)];
    int dx[]= {-1,1,0,0};
    int dy[]= {0,0,-1,1};
    struct node
    {
        int x,y,step,key;
    }st;
    queue<node>Q;
    
    bool check(int x,int y)
    {
        if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]!='*') return true;
        return false;
    }
    
    int bfs()
    {
        while(!Q.empty())  Q.pop();
        memset(vis,false,sizeof(vis));
        vis[st.x][st.y][st.key]=true;
        st.key=st.step=0;Q.push(st);
        node cur,nex;
        while(!Q.empty())
        {
            cur=Q.front();Q.pop();
            if(map[cur.x][cur.y]=='^')return cur.step;
            for(int i=0; i<4; i++)
            {
                nex.x=cur.x+dx[i];nex.y=cur.y+dy[i];
                nex.key=cur.key;
                if(!check(nex.x,nex.y)) continue;
                nex.step=cur.step+1;
                if(nex.step>=t) continue;
                else if(map[nex.x][nex.y]>='A' && map[nex.x][nex.y]<='Z')
                {
                    int temp=map[nex.x][nex.y]-'A';
                    int K=cur.key&1<<temp;
                    if(K && !vis[nex.x][nex.y][nex.key])
                    {
                        vis[nex.x][nex.y][nex.key]=true;
                        Q.push(nex);
                    }
                }
                else if(map[nex.x][nex.y]>='a' && map[nex.x][nex.y]<='z')
                {
                    int temp=map[nex.x][nex.y]-'a';
                    nex.key=cur.key|1<<temp;
                    if(!vis[nex.x][nex.y][nex.key])
                    {
                        vis[nex.x][nex.y][nex.key]=true;
                        Q.push(nex);
                    }
                }
                else
                {
                    if(!vis[nex.x][nex.y][nex.key])
                    {
                        vis[nex.x][nex.y][nex.key]=true;
                        Q.push(nex);
                    }
                }
            }
        }return -1;
    }
    
    inline void init()
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str+1);
            for(int j=1;j<=m;j++)
            {
                if(str[j]=='@')
                {
                    st.x=i;st.y=j;
                    map[i][j]=str[j];
                }
                else  map[i][j]=str[j];
            }
        }
    }
    
    int main()
    {
        while(~scanf("%d%d%d",&n,&m,&t))
        {
            init();
            int ans=bfs();
            printf("%d
    ",ans);
        }
        return 0;
    }
     
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    vue 中使用 rem 布局的两种方法
    ant design pro请求返回全局参数 ant design pro超详细入门教程
    小程序中页面跳转路由传参
    检查域名所对应的ip
    小程序数据可视化echarts 动态设置数据
    微信小程序:上拉加载更多
    微信小程序接入百度OCR(身份证识别)
    JavaScript鼠标事件,点击鼠标右键,弹出div
    java 相关文件安装
    微信小程序自定义顶部组件customHeader的示例代码 小程序中如何引用阿里图标
  • 原文地址:https://www.cnblogs.com/L-Memory/p/7405812.html
Copyright © 2020-2023  润新知