zoukankan      html  css  js  c++  java
  • HDOJ 1429 胜利大逃亡(续)



    胜利大逃亡(续)

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


    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
     

    Recommend
    linle
     


    NODE:

    用2进制来表示钥匙 和 模拟开锁 和判重


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>

    using namespace std;

    char ma[22][22];
    bool vis[22][22][2000];
    int n,m,T;

    int dir_x[4]={1,-1,0,0};
    int dir_y[4]={0,0,1,-1};

    struct Node
    {
        int x,y;
        int key;
        int time;
    };

    queue<Node> Q;

    void bfs()
    {
        Node A;Node B;
        while(!Q.empty())
        {
            A=Q.front();
            Q.pop();
            if(A.time>=T) continue;
            if(ma[A.x][A.y]=='^')
            {
                printf("%d ",A.time);
                return ;
            }

            for(int i=0;i<4;i++)
            {
                int tx=A.x+dir_x;
                int ty=A.y+dir_y;
                int key=A.key;

                if(ma[tx][ty]=='*')  continue;
                else if(ma[tx][ty]>='a'&&ma[tx][ty]<='z'&&vis[tx][ty][key])
                {
                    key=key|(1<<(ma[tx][ty]-'a'));
                    B.x=tx; B.y=ty;
                    B.time=A.time+1;
                    B.key=key;
                    vis[tx][ty][key]=false;
                    Q.push(B);

                }
                else if((ma[tx][ty]=='.'||ma[tx][ty]=='^')&&vis[tx][ty][key])
                {
                    B.x=tx; B.y=ty;
                    B.time=A.time+1;
                    B.key=key;
                    vis[tx][ty][key]=false;
                    Q.push(B);
                }
                else if(ma[tx][ty]>='A'&&ma[tx][ty]<='Z'&&vis[tx][ty][key])
                {
                    if(key&(1<<(ma[tx][ty]-'A')))
                    {
                        B.x=tx; B.y=ty;
                        B.time=A.time+1;
                        B.key=key;
                        vis[tx][ty][key]=false;
                        Q.push(B);
                    }
                }
            }

        }
        printf("-1 ");
        return ;
    }

    int main()
    {
    while(scanf("%d%d%d",&n,&m,&T)!=EOF)
    {
        getchar();
        while(!Q.empty()) Q.pop();
        Node k;
        memset(ma,'*',sizeof(ma));
        memset(vis,true,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%c",&ma[j]);
                if(ma[j]=='@')
                {
                    k.x=i; k.y=j;
                    k.key=0;
                    k.time=0;
                    ma[j]='.';
                }
            }
            getchar();
        }
        vis[k.x][k.y][0]=false;
        Q.push(k);
        bfs();
    }

        return 0;
    }




  • 相关阅读:
    mysql备份数据及导入数据
    django.db.migrations.graph.NodeNotFoundError: Migration travel_list.0001_initial dependencies reference nonexistent parent node ('employer', '0001_initial')问题
    JAVA 两个对象不同为什么他们的hashcode有可能相同
    Java序列化的作用和反序列化
    Java语言中的值传递与引用传递
    Java中关键字this、super的含义及使用
    java redis client jedis 测试及常用命令
    使用AJAX报406错误
    Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
    连接zookeeper+solr的服务器超时
  • 原文地址:https://www.cnblogs.com/CKboss/p/3351003.html
Copyright © 2011-2022 走看看