Problem Description
  1. Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……
  2.  
  3. 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
Input
  1. 每组测试数据的第一行有三个整数n,m,t(<=n,m<=,t>)。接下来的nm列为地牢的地图,其中包括:
  2.  
  3. . 代表路
  4. * 代表墙
  5. @ 代表Ignatius的起始位置
  6. ^ 代表地牢的出口
  7. A-J 代表带锁的门,对应的钥匙分别为a-j
  8. a-j 代表钥匙,对应的门分别为A-J
  9.  
  10. 每组测试数据之间有一个空行。
 
Output
  1. 针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-。
 
Sample Input
  1. @A.B.
  2. a*.*.
  3. *..*^
  4. c..b*
  5.  
  6. @A.B.
  7. a*.*.
  8. *..*^
  9. c..b*
 
Sample Output
  1. -
 
Source
 
 

 第46行,if((t2.key&(1<<j))==0){//写成 t2.key&(1<<j)==0竟然一直错,&#%**&*!@#@#@!@! 

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<stdlib.h>
  6. #include<algorithm>
  7. using namespace std;
  8. #define N 26
  9. #define M (1<<10)+6
  10. int n,m,t;
  11. char mp[N][N];
  12. struct Node{
  13. int x,y;
  14. int t;
  15. int key;
  16. }st,ed;
  17. int dirx[]={,,-,};
  18. int diry[]={-,,,};
  19. char keys[]={'a','b','c','d','e','f','g','h','i','j'};
  20. char door[]={'A','B','C','D','E','F','G','H','I','J'};
  21. int vis[N][N][M];
  22. void bfs(){
  23. queue<Node>q;
  24. q.push(st);
  25. vis[st.x][st.y][st.key]=;
  26. Node t1,t2;
  27. while(!q.empty()){
  28. t1=q.front();
  29. //printf("*** %d%d %d\n",t1.x,t1.y,t1.key);
  30. q.pop();
  31. if(t1.x==ed.x && t1.y==ed.y && t1.t<t){
  32. printf("%d\n",t1.t);
  33. return;
  34. }
  35. for(int i=;i<;i++){
  36. t2=t1;
  37. t2.x=t1.x+dirx[i];
  38. t2.y=t1.y+diry[i];
  39. if(mp[t2.x][t2.y]=='*') continue;
  40. if(t2.x< || t2.x>=n || t2.y< || t2.y>=m) continue;
  41. if(vis[t2.x][t2.y][t2.key]) continue;
  42. if(islower(mp[t2.x][t2.y])){
  43. for(int j=;j<;j++){
  44. if(mp[t2.x][t2.y]==keys[j]){
  45.  
  46. if((t2.key&(<<j))==){//写成 t2.key&(1<<j)==0竟然一直错,&#%**&*!@#@#@!@!
  47. t2.key+=(<<j);
  48. t2.t++;
  49. vis[t2.x][t2.y][t2.key]=;
  50. q.push(t2);
  51. }
  52. else{
  53. //printf("+++%d\n",t2.key);
  54. if(vis[t2.x][t2.y][t2.key]==){
  55. t2.t++;
  56. vis[t2.x][t2.y][t2.key]=;
  57. q.push(t2);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. else if(isupper(mp[t2.x][t2.y])){
  64. for(int j=;j<;j++){
  65. if(mp[t2.x][t2.y]==door[j]){
  66. if(t2.key&(<<j)){
  67. t2.t++;
  68. vis[t2.x][t2.y][t2.key]=;
  69. q.push(t2);
  70. }
  71. }
  72. }
  73. }
  74. else{
  75. t2.t++;
  76. vis[t2.x][t2.y][t2.key]=;
  77. q.push(t2);
  78. }
  79.  
  80. }
  81. }
  82. printf("-1\n");
  83. }
  84. int main()
  85. {
  86. while(scanf("%d%d%d",&n,&m,&t)==){
  87. for(int i=;i<n;i++){
  88. scanf("%s",mp[i]);
  89. for(int j=;j<m;j++){
  90. if(mp[i][j]=='@'){
  91. st.x=i;
  92. st.y=j;
  93. st.t=;
  94. st.key=;
  95. }
  96. if(mp[i][j]=='^'){
  97. ed.x=i;
  98. ed.y=j;
  99. }
  100. }
  101. }
  102.  
  103. memset(vis,,sizeof(vis));
  104. bfs();
  105. }
  106. return ;
  107. }

hdu 1429 胜利大逃亡(续)(bfs+状态压缩)的更多相关文章

  1. hdu - 1429 胜利大逃亡(续) (bfs状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...

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

    又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...

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

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

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

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

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

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

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

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

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

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

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

  10. 胜利大逃亡(续)(状态压缩bfs)

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

随机推荐

  1. Python 中文报错 SyntaxError: Non-ASCII character解决办法

    只需要在最顶部的位置加上 #-*- coding:utf-8 -*- 就行了. 如果还是没有好,打开设置并搜索file encoding并作如图修改便好.

  2. (转)iOS Wow体验 - 第七章 - 操作图例与触屏人机工学

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第七章译文精选,其余章节将陆续放出.上一篇:Wow ...

  3. Java基础 -- 冒泡排序算法(带详细注释)

    冒泡排序的要点: 1.多轮排序,每轮排序中选出最大的元素放在最顶端,并且下次排序不再使用该元素; 2. 使用双for循环,外层for循环控制要排序的次数(轮数), 内层for循环控制当前要排序的元素并 ...

  4. Javascript: 截取字符串多出来并用省略号[...]显示

    /背景知识/ substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 参数描述 start 必需.一个非负的整数 ...

  5. AssemblyInfo.cs文件的作用

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些參数,以下是默认的AssemblyInfo.cs文件的内容详细介绍 //是否符合公共 ...

  6. Laravel 4 Blade模板引擎

    http://my.oschina.net/5say/blog/201290 模板输出 基本输出 1 <!-- app/views/example.blade.php --> 2 < ...

  7. (转)vivoxshot 精英版三模转五模模式切换操作方法

    https://yunpan.cn/cPUBWc8vtKpID (提取码:de92) 本帖最后由 韩爱峰 于 2016-3-29 23:00 编辑 碰到不少机友在使用过程中操作不成功,现将我的方法跟大 ...

  8. viewstate加密(转)

    ViewState在客户端展开的时候,默认是Auto,不加密的,如果页面有限制性的表单控件才加密,所以,可以查看,代码如下: byte[] bytes = Convert.FromBase64Stri ...

  9. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  10. .net安装windows服务配置文件config

    .net安装windows服务 : 在windows服务的项目(WindowsService1)代码文件中有一个app.config 配置文件,可以通过此文件进行时间等的更改而无需重新生成项目:那我们 ...