题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。因为这里我贡献了一次wa。

分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口,对钥匙进行状态压缩,具体看代码实现!

代码实现:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. int n,m,time,visited[][][];
  9. int sx,sy,ex,ey,res;
  10. int b[][]={{,},{,-},{,},{-,}};
  11. char map[][];
  12.  
  13. struct node{
  14. int x;
  15. int y;
  16. int t;
  17. int st;
  18. };
  19.  
  20. int check(int x,int y)
  21. {
  22. if(x>=&&x<=n&&y>=&&y<=m&&map[x][y]!='*')
  23. return ;
  24. else
  25. return ;
  26. }
  27.  
  28. void bfs()
  29. {
  30. queue<node>Q;
  31. struct node p,temp;
  32. int i,j,add;
  33. memset(visited,,sizeof(visited));
  34. p.x=sx;p.y=sy;
  35. p.t=;p.st=;
  36. visited[sx][sy][]=;
  37. Q.push(p);
  38. while(!Q.empty())
  39. {
  40. p=Q.front();
  41. Q.pop();
  42. if(p.x==ex&&p.y==ey&&p.t<time)//这里要注意下,为此贡献了一次wa
  43. {
  44. res=p.t;
  45. return ;
  46. }
  47. if(p.t>=time)
  48. return ;
  49. for(i=;i<;i++)
  50. {
  51. temp.x=p.x+b[i][];
  52. temp.y=p.y+b[i][];
  53. temp.t=p.t+;
  54. temp.st=p.st;
  55. if(check(temp.x,temp.y))
  56. {
  57. if(map[temp.x][temp.y]>='a'&&map[temp.x][temp.y]<='j')
  58. {
  59. add=<<(map[temp.x][temp.y]-'a');
  60. temp.st=temp.st|add;
  61. if(visited[temp.x][temp.y][temp.st]==)
  62. {
  63. visited[temp.x][temp.y][temp.st]=;
  64. Q.push(temp);
  65. }
  66. }
  67. else if(map[temp.x][temp.y]>='A'&&map[temp.x][temp.y]<='J')
  68. {
  69. add=<<(map[temp.x][temp.y]-'A');
  70. if((temp.st&add)&&visited[temp.x][temp.y][temp.st]==)
  71. {
  72. visited[temp.x][temp.y][temp.st]=;
  73. Q.push(temp);
  74. }
  75. }
  76. else if(visited[temp.x][temp.y][temp.st]==)
  77. {
  78. visited[temp.x][temp.y][temp.st]=;
  79. Q.push(temp);
  80. }
  81. }
  82. }
  83. }
  84. }
  85.  
  86. int main()
  87. {
  88. int i,j;
  89. while(scanf("%d%d%d",&n,&m,&time)!=EOF)
  90. {
  91. res=-;
  92. for(i=;i<=n;i++)
  93. {
  94. getchar();
  95. for(j=;j<=m;j++)
  96. {
  97. scanf("%c",&map[i][j]);
  98. if(map[i][j]=='@')
  99. {
  100. sx=i;
  101. sy=j;
  102. }
  103. else if(map[i][j]=='^')
  104. {
  105. ex=i;
  106. ey=j;
  107. }
  108. }
  109. }
  110. bfs();
  111. printf("%d\n",res);
  112. }
  113. return ;
  114. }

hdu 1429(bfs+状态压缩)的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 典型的状压搜索,在普通的搜索基础上,利用二进制的特性记录钥匙与门, 二进制的每一位代表一把钥匙,比如说拿到 ...

  2. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

  3. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  4. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  5. HDU1429+bfs+状态压缩

    bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...

  6. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  7. poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

    Description Flip game squares. One side of each piece is white and the other one is black and each p ...

  8. BFS+状态压缩 HDU1429

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

  9. hdu 5724 SG+状态压缩

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. RxJava+Retrofit+MVP构建的App——聚合资讯

    RtfRxMVP 聚合资讯APP,提供热点资讯,天气预报以及笑话精选服务,使用 Retrofit + RxJava + MVP 构建代码. Hello U 这是我的一个练习项目,第一次尝试运用 MVP ...

  2. 详解TCP和UDP数据段的首部格式

    TCP数据段的首部格式: 源端口号(16) 目的端口号(16) 序列号(32) 确认应答号(32) 数据偏移(4) 保留(6) 代码位(6) 窗口(16) 校验和(16) 紧急指针 选项(长度可变) ...

  3. swift:入门知识之类和对象

    1.swift中使用class创建一个类.一个类的声明则是在类里作为常量或变量声明的,除了是在类的上下文中.在方法和函数中也是这么写的. 2.swift中使用init(...)作为初始化构造函数 3. ...

  4. RHEL7服务管理

    对于学习过红帽RHEL6的系统或已经习惯使用service.chkconfig等命令来管理系统服务的用户可能要郁闷了, 因为在红帽RHEL7系统中管理服务的命令变成了“systemctl”,但使用方法 ...

  5. Android之开发杂记(一)

    1.cygwin环境变量设置 可在Cygwin.bat 中设置 set NDK_ROOT=P:/android/android-ndk-r8e 或者在home\Administrator\.bash_ ...

  6. Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)

    然后是项目下的文件:完整的项目请看  上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...

  7. 【首先膜拜大湿】poj-2386-Lake Counting-DFS模板题

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16802   Accepted: 8523 De ...

  8. HDU 4691 Front compression(后缀数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691 题意:给出Input,求出Compressed output.输出各用多少字节. 思路:求后缀数 ...

  9. 单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...

  10. HeadFirst Jsp 06 (会话管理)

    现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...