胜利大逃亡(续)

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. 【转】javascript性能优化-repaint和reflow

    repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲 ...

  2. iframe 父子窗口相互之间调用语法

    一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></i ...

  3. NSKeyValueObserving(KVO)

    NSKeyValueObserving非正式协议定义了一种机制,它允许对象去监听其它对象的某个属性的修改. 我们可以监听一个对象的属性,包括简单属性,一对一的关系,和一对多的关系.一对多关系的监听者会 ...

  4. Beyond Compare 4

    Beyond Compare是一款不可多得的专业级的文件夹和文件对比工具.使用他可以很方便的对比出两个文件夹或者文件的不同之处.并把相差的每一个字节用颜色加以表示,查看方便.并且支持多种规则对比.

  5. 关于 ajax 动态返回数据 css 以及 js 失效问题

    ajax 毕竟是异步的 所以动态加载出来的数据 难免遇到 css 或者 js 失效的问题,所以要动态加载 css ji等文件了 1.公共方法 load //动态加载 js /css function ...

  6. Win10无法上网提示缺少一个或者多个网络协议的处理方法

    netsh winsock reset Win+x   再按A 输入 netsh winsock reset

  7. Android实现地图服务

    Android实现地图服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里使用的是百度地图,具体配置方法请看官方文档即可.(也可以参考我 ...

  8. Android实现AppWidget、Broadcast动态注册

    Android实现AppWidget.Broadcast动态注册 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 主界面可以编辑广播的信息,点 ...

  9. label swift

    var label = UILabel(frame: CGRectMake(10, 20, 300, 100)) label.text = "<Swift语言实战入门>" ...

  10. Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误

    今天用Xcode 7 创建新项目用到 URL 发送请求时,报下面的错: “App Transport Security has blocked a cleartext HTTP (http://) r ...