胜利大逃亡(续)

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. 将python2.7+django1.10部署到SAE上

    首先我想说的是我为什么选择SAE呢?本人学生一枚,没钱.然后sae好像又有免费的一定限额,所以我就选了它. 期间曲折颇多,实在不是三言两语所能道情的.各种百度,谷歌,最后所幸成功了,幸哉! 主要参考了 ...

  2. [笔记]--Oracle 10g在Windows 32位系统使用2G以上内存

    1.修改c:\boot.ini文件 打开boot.ini文件,我的电脑->属性->高级->启动和恢复->编辑,设置在最后一行末尾添加/PAE选项后如下: [boot loade ...

  3. spring aop 使用xml方式的简单总结

    spring aop的 xml的配置方式的简单实现: 1.编写自己的切面类:配置各个通知类型 /** * */ package com.lilin.maven.service.aop; import ...

  4. JS对文本框值的判断

    JS判断只能是数字和小数点(摘录自其它资料,在此发表只为个人以后使用查找方便) 1.文本框只能输入数字(不包括小数点) <input onkeyup="this.value=this. ...

  5. hdu 5183 Negative and Positive (NP)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5183 Negative and Positive (NP) Description When give ...

  6. net-snmp的安装

    安装环境是ubuntu 14. 方法1:apt-get install  net-snmp (非root用户需要sudo 提升权限) 方法2:自定义安装选择不同的版本去编译. 1:先去下载所需要的ta ...

  7. iOS学习之UIView

    一.UI编程概述      1.UI的本意是用户界面,是英文User和Interface的缩写.      2.UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计.      3.软件设计可 ...

  8. php xml转为xml或者json

    <?php class XmlToArray { private $xml; private $contentAsName="content" ; private $attr ...

  9. php取整函数floor(),round(),intval(),ceil()

    ceil -- 进一法取整说明float ceil ( float value )返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 float, ...

  10. 006--VS2013 C++ 加载其他格式图片,并显示半透明化

    //--------------------------------------------MyPaint() 函数------------------------------------------ ...