胜利大逃亡(续)

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\n",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\n");
    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;
}

HDOJ 1429 胜利大逃亡(续)的更多相关文章

  1. hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】

    题目:pid=1429">hdoj 1429 胜利大逃亡(续) 同样题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间.确定用BFS 这个题目的难点在于有几个锁对于几把钥匙.唯 ...

  2. HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...

  3. hdu 1429 胜利大逃亡(续)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...

  4. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  5. hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  6. Hdu 1429 胜利大逃亡(续) 分类: Brush Mode 2014-08-07 17:01 92人阅读 评论(0) 收藏

    胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  7. hdu 1429 胜利大逃亡(续)(bfs+位压缩)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. HDU 1429 胜利大逃亡(续)(DP + 状态压缩)

    胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...

  9. HDU 1429 胜利大逃亡(续)(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. 一个自定义的C#数据库操作基础类 SqlHelper

    SqlHelper其实是我们自己编写的一个类,使用这个类目的就是让使用者更方便.更安全的对数据库的操作,既是除了在SqlHelper类以外的所有类将不用引用对数据库操作的任何类与语句,无须担心数据库的 ...

  2. 蒙牛乳业六厂—第一家MES工厂

    在上海西门子工业自动化(SIAS)与蒙牛液态奶事业部以及蒙牛集团信息中心的共同努力下,经过项目组成员1年半时间的具体实施,中国乳品行业第一个真正意义上的生产执行系统MES,于2008年6月在蒙牛乳业集 ...

  3. jQuery学习笔记(2)

    val() 当鼠标放上去的时候,文本消失,鼠标拿开,文本恢复 效果图: code as below: <html xmlns="http://www.w3.org/1999/xhtml ...

  4. C# 页面抓取获取快递信息

    通过页面抓取信息可以获得很多我们想要的信息,比如现在常会用到的快递查询,主要抓取的网站为http://www.kuaidi100.com/ 通过IE的网络分析我们可以得到下面信息 通过对这个网站的分析 ...

  5. Oracle Database Cloud Services

    Oracle 开始也把数据库服务作为PaaS 服务,好吧 Oracle 叫做 DBaaS,数据库服务 https://cloud.oracle.com/database?tabID=138367891 ...

  6. 刀哥多线程Barrier异步gcd-08-barrier_async

    Barrier 异步 主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新 适合于大规模的 I/O 操作 代码演练 准备工作 @interface ViewController () { / ...

  7. Javascript是一个事件驱动语言

    面向原型这种说法我没在网上找到

  8. SQLite之写一个表

    1.首先你需要一个路径. 获取document目录并返回数据库目录 - (NSString *)dataFilePath{ NSArray *paths = NSSearchPathForDirect ...

  9. 42.JTAG接口使用注意

    无论是客户反馈,还是自己亲身经历,USB-Blaster不能下载配置FPGA的情况时有出现.究其原因,大致有如下几条: 1. FPGA器件上的JTAG相关引脚出现故障: 2. USB-Blaster坏 ...

  10. [uwp开发]数据绑定那些事(2)

    接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...