zoukankan      html  css  js  c++  java
  • HDU1429 bfs

    胜利大逃亡(续)

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


    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
    代码:
    //显然bfs,但是要记录访问过的状态,用二进制记录访问过的状态vis[21][21][1<<11],[1<<10]记录10把钥匙的状态
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct Lu
    {
        char mp[21][21];
        int px,py,tim;
        int sta;
    }L;
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    bool vis[21][21][1<<11];
    int n,m,t;
    int bfs()
    {
        queue<Lu>q;
        Lu L1,L2;
        memset(vis,0,sizeof(vis));
        vis[L.px][L.py][0]=1;
        L.tim=0;L.sta=0;
        q.push(L);
        while(!q.empty()){
            L1=q.front();
            q.pop();
            if(L1.tim>=t) break;//超过时间就不用搜了
            if(L1.mp[L1.px][L1.py]=='^') return L1.tim;
            for(int i=0;i<4;i++){
                int x=L1.px+dir[i][0],y=L1.py+dir[i][1];
                if(x<0||x>=n||y<0||y>=m) continue;
                if(L1.mp[x][y]=='*') continue;
                if(L1.mp[x][y]>='a'&&L1.mp[x][y]<='j'){
                    L2=L1;
                    L2.sta=(L1.sta|(1<<(L1.mp[x][y]-'a')));
                    vis[x][y][L1.sta]=1;
                    L2.px=x;L2.py=y;
                    L2.mp[x][y]='.';
                    L2.tim++;
                    q.push(L2);
                }
                if(L1.mp[x][y]>='A'&&L1.mp[x][y]<='J'){
                    int now=(1<<(L1.mp[x][y]-'A'));
                    if(!(now&L1.sta)) continue;
                    L2=L1;
                    vis[x][y][L1.sta]=1;
                    L2.px=x;L2.py=y;
                    L2.mp[x][y]='.';
                    L2.tim++;
                    q.push(L2);
                }
                else if(!vis[x][y][L1.sta]){
                    L2=L1;
                    vis[x][y][L1.sta]=1;
                    L2.px=x;L2.py=y;
                    L2.tim++;
                    q.push(L2);
                }
            }
        }
        return -1;
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&t)!=EOF){
            for(int i=0;i<n;i++){
                scanf("%s",L.mp[i]);
                for(int j=0;j<m;j++)
                    if(L.mp[i][j]=='@') {L.px=i;L.py=j;}
            }
            int ans=bfs();
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    2019年第二周作业
    2019年pta作业第二题——求最大值及其下标
    2019春第十一周作业
    2019春第十周作业
    2019年寒假作业3
    2019年寒假作业2
    2019年寒假作业1
    我的老师
    自说
    Day16
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6287626.html
Copyright © 2011-2022 走看看