胜利大逃亡(续)

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 3   Accepted Submission(s) : 3

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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

ACM暑期集训队练习赛(三)

————————————————————————————————————————————————————————————————————————

题目:在一定时间内逃出城堡,途中可能会遇到10种门或钥匙,每种门对应一种钥匙。

思路:在当前的状态里添加一维key值,表示现在手上所拿的钥匙数,key值其实是一个二进制表示,001表示拿到了a钥匙,1011表示拿到了a、b、d这三把钥匙。当BFS遇到钥匙的时候,用或运算将遇到的钥匙添加到key值中,当遇到门的时候,与运算来判断当前的门的钥匙是否已经拿到。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
char map[25][25];
int m,n,t;
int vir[1<<10][25][25];
int dir[4][2] = { { -1, 0 }, { 1, 0}, { 0, -1}, { 0, 1} }; struct node
{
int x, y ,cnt;
int a;
};
bool cheak(int i, int j)
{
if (i < 1 || i > m || j < 1 || j >n || map[i][j]=='*')
return 0;
else
return 1;
} int bfs(int si,int sj,int di,int dj)
{
queue<node>q;
node f,d;
f.x=si;
f.y=sj;
f.cnt=0;
f.a=0;
vir[f.a][f.x][f.y]=1;
q.push(f);
while(!q.empty())
{
f=q.front();
q.pop();
if(f.x==di&&f.y==dj&&f.cnt<t)
return f.cnt;
if(f.cnt==t)
continue;
for(int i=0;i<4;i++)
{
d.x =f.x+dir[i][0];
d.y=f.y+dir[i][1];
d.a=f.a;
if(cheak(d.x,d.y)&&!vir[d.a][d.x][d.y])
{ if(map[d.x][d.y]=='.'||map[d.x][d.y]=='@'||map[d.x][d.y]=='^')
{
vir[d.a][d.x][d.y]=1;
d.cnt=f.cnt+1;
q.push(d);
}
else if(map[d.x][d.y]>='a'&&map[d.x][d.y]<='j')
{
d.cnt=f.cnt+1;
d.a=1<<(map[d.x][d.y]-'a')|f.a;
vir[d.a][d.x][d.y]=1;
q.push(d);
}
else if(map[d.x][d.y]>='A'&&map[d.x][d.y]<='J')
{
if(1<<(map[d.x][d.y]-'A')&d.a)
{
vir[d.a][d.x][d.y]=1;
d.cnt=f.cnt+1;
q.push(d);
}
} } } }
return -1; } int main()
{
int o,si,sj,di,dj;
while (~scanf("%d%d%d",&m, &n, &t))
{
getchar();
for (int i = 1; i <=m; i++)
{ for (int j = 1; j <= n; j++)
{
scanf("%c", &map[i][j]);
if(map[i][j]=='@')
{
si=i;
sj=j;
}
if(map[i][j]=='^')
{
di=i;
dj=j;
}
}
getchar();
}
memset(vir,0,sizeof(vir));
int ans = bfs(si,sj,di,dj);
printf("%d\n", ans);
} return 0; }

Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏的更多相关文章

  1. C#期末大作业 消消乐 2017-06-01 18:11 275人阅读 评论(0) 收藏

    邻近期末,忙于刷题之余意识到期末大作业来不及了,匆匆赶下了作业,虽说做的很是粗糙,但完全原创的 下载链接 https://pan.baidu.com/s/1cCNLr4 大体的做大约3天完成了: 第一 ...

  2. 排序练习——找出前m大的数字 分类: 排序 2015-06-08 09:33 21人阅读 评论(0) 收藏

    排序练习--找出前m大的数字 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定n个数字,找出前m大的数字.   输入  多组输 ...

  3. Hdu1874 畅通工程续 2017-04-12 18:37 48人阅读 评论(0) 收藏

    畅通工程续 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  4. HDU1232 畅通工程 2017-04-12 19:20 53人阅读 评论(0) 收藏

    畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  5. 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 ...

  6. HDU1253 胜利大逃亡(BFS) 2016-07-24 13:41 67人阅读 评论(0) 收藏

    胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...

  7. Self Numbers 分类: POJ 2015-06-12 20:07 14人阅读 评论(0) 收藏

    Self Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22101   Accepted: 12429 De ...

  8. ZOJ2748 Free Kick 2017-04-18 20:40 40人阅读 评论(0) 收藏

    Free Kick Time Limit: 2 Seconds      Memory Limit: 65536 KB In a soccer game, a direct free kick is ...

  9. hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】

    题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...

随机推荐

  1. column count of mysql.proc is wrong. expected 20,found 16. the table is probably corruptd.

    1558 1547 column count of mysql.proc is wrong. expected 20,found 16. the table is probably corruptd. ...

  2. 虚拟机Linux桥接模式下设置静态IP

    之前一直使用NAT模式,测试时android端远程访问虚拟机的mysql时发现无法连接,但是访问同学拷过来的虚拟机Linux的mysql却成功了,想了下原因是他设置的桥接模式.关于两种模式的区别,网上 ...

  3. scrollTop、offsetHeight和offsetTop等属性用法详解--转转转

    scrollTop.offsetHeight和offsetTop等属性用法详解: 标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼 ...

  4. F5 源地址保持

    Virtusl Server: Web Portal 建议选择成Source_Addr(源地址保持).因为Web Portal提供WEB服务给用户访问,压力比较大,而源地址保持的方式处理速度比Cook ...

  5. CSS布局模型学习

    转自:http://www.cnblogs.com/erliang/p/4092192.html CSS布局模型学习   参考链接慕课网:HTML+CSS基础课程 知识基础 1. 样式 内联 嵌入 外 ...

  6. CFGym 100211J 题解

    一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...

  7. 二.jQuery源码解析之构建jQuery之构建函数jQuery的7种用法

    一:$(selectorStr[,限制范围]),接受一个选择器(符合jQuery规范的字符串),返回一个jQuery对象; 二:$(htmlStr[,文档对象]),$(html[,json对象])传入 ...

  8. django-auth组件的权限管理

    一:自定义权限验证 1.在model中的Meta类自定义权限码 class WorkUser(models.Model): username = models.CharField(u'用户名', ma ...

  9. lombok 的使用

    参考:https://blog.csdn.net/motui/article/details/79012846

  10. JAVA_02

    class Test2_Extents{ public static void main(String[] args){ System.out.println("Hello World&qu ...