bfs+状态压缩
思路:用2进制表示每个钥匙是否已经被找到。、

  1. /*
  2. bfs+状态压缩
  3. 思路:用2进制表示每个钥匙是否已经被找到。
  4. */
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<string.h>
  8. #include<stdlib.h>
  9. #include<stdio.h>
  10. #include<math.h>
  11. #include<queue>
  12. #include<stack>
  13. #include<map>
  14. #include<set>
  15. using namespace std;
  16. typedef long long int64;
  17. //typedef __int64 int64;
  18. typedef pair<int64,int64> PII;
  19. #define MP(a,b) make_pair((a),(b))
  20. const int inf = 0x3f3f3f3f;
  21. const double pi=acos(-1.0);
  22. const int dx[]={,-,,};
  23. const int dy[]={,,,-};
  24. const double eps = 1e-;
  25. const int maxm = (<<)+;
  26. const int maxn = ;
  27.  
  28. bool vis[ maxn ][ maxn ][ maxm ];
  29. char mat[ maxn ][ maxn ];
  30. struct Point {
  31. int x,y,ti,key;
  32. };
  33. Point s,e;
  34. queue<Point>q;
  35.  
  36. int bfs( int n,int m,int sumT ){
  37. memset( vis,false,sizeof( vis ) );
  38. while( !q.empty() )
  39. q.pop();
  40. Point cur;
  41. cur = s;
  42. vis[ cur.x ][ cur.y ][ cur.key ] = true;
  43. q.push( cur );
  44. while( !q.empty() ){
  45. cur = q.front();
  46. q.pop();
  47. if( cur.x==e.x && cur.y==e.y ){
  48. e.ti = min( e.ti,cur.ti );
  49. }
  50. if( cur.ti>=sumT ) continue;
  51. for( int i=;i<;i++ ){
  52. Point nxt ;
  53. nxt.x = cur.x + dx[ i ];
  54. nxt.y = cur.y + dy[ i ];
  55. nxt.ti = cur.ti + ;
  56. nxt.key = cur.key;
  57. if( nxt.x<||nxt.x>=n||nxt.y<||nxt.y>=m ) continue;
  58. if( mat[ nxt.x ][ nxt.y ]=='*' ) continue;
  59. if( mat[ nxt.x ][ nxt.y ]>='a' && mat[ nxt.x ][ nxt.y ]<='z' ){
  60. nxt.key = cur.key|(<<(mat[ nxt.x ][ nxt.y ]-'a'));
  61. }//there may be a new key
  62. if( vis[ nxt.x ][ nxt.y ][ nxt.key ]==true )
  63. continue;
  64. vis[ nxt.x ][ nxt.y ][ nxt.key ] = true;
  65. if( mat[ nxt.x ][ nxt.y ]>='A' && mat[ nxt.x ][ nxt.y ]<='Z' ){
  66. if( nxt.key&(<<(mat[ nxt.x ][ nxt.y ]-'A')) ){
  67. q.push( nxt );
  68. }
  69. }
  70. else
  71. q.push( nxt );
  72. }
  73. }
  74. if( e.ti>=sumT )
  75. return -;
  76. else
  77. return e.ti;
  78. }
  79.  
  80. int main(){
  81. int n,m,sumT;
  82. while( scanf("%d%d%d",&n,&m,&sumT)== ){
  83. for( int i=;i<n;i++ ){
  84. scanf("%s",mat[ i ]);
  85. for( int j=;j<m;j++ ){
  86. if( mat[ i ][ j ]=='@' ){
  87. s.x = i;
  88. s.y = j;
  89. s.ti = ;
  90. s.key = ;
  91. mat[ i ][ j ] = '.';
  92. }
  93. if( mat[ i ][ j ]=='^' ){
  94. e.x = i;
  95. e.y = j;
  96. e.ti = sumT+;
  97. mat[ i ][ j ] = '.';
  98. }
  99. }
  100. }
  101. printf("%d\n",bfs( n,m,sumT ));
  102. }
  103. return ;
  104. }

HDU1429+bfs+状态压缩的更多相关文章

  1. BFS+状态压缩 HDU1429

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

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

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

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

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

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

  5. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

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

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

  7. HDU 1885 Key Task (BFS + 状态压缩)

    题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...

  8. hdu 1429(bfs+状态压缩)

    题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...

  9. UVALive 3956 Key Task (bfs+状态压缩)

    Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...

随机推荐

  1. 相似度到大数据查找之Mysql 文章匹配的一些思路与提高查询速度

    文章相关度匹配的一些思路---"压缩"预料库,即提取用特征词或词频,量化后以“列向量”形式保存到数据库:按前N组词拼为向量组供查询使用,即组合为1到N字的组合,量化后以“行向量”形 ...

  2. (转)mysql、sqlserver、oracle的默认事务的隔离级别

    1.mysql的默认事务的隔离级别:可重复读取(repeatable read); 2.sqlserver的默认事务的隔离级别:提交读取(read committed); 3.oracle的默认事务的 ...

  3. Js跳出循环

    break和 continue break 中断整个循环 continue 跳出当前循环,进入下一次循环 break示例: 例1: 例2: Continue:跳出当前循环,进入下一次循环 Break与 ...

  4. SpringInAction读书笔记--第1章Spring之旅

    1.简化Java开发 Spring是一个开源框架,它的根本使命在于简化java开发.为了降低java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程      ...

  5. 文档生产工具 Doxygen

    Doxygen是一种开源跨平台的,类似JavaDoc风格描述的文档系统,支持C.C++.Java.Objective-C等语言.可以从一套归档源文件开始,生成HTML,XML,pdf等不同风格的格式. ...

  6. [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组

    1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一 ...

  7. ToolStripStatusLabel设置时间自动更新

    在使用委托设置界面上ToolStripStatusLabel类型的控件时间是,发现不能使用自定义的委托方法,在往上查找了一下发现不能使用involve来线程调用.因此只能使用原生委托方法. //代理p ...

  8. Sublime Text 3 入门(插件控制台安装)

    下载地址:http://www.sublimetext.com/3 以windows 32位系统为例 直接点击Windows下载: Package Control插件控制台(有这个才可以安装插件) h ...

  9. PHP服务器负载判断

    <?php header("content-type:text/html;charset=utf-8"); // echo PHP_OS;exit; // echo get_ ...

  10. Cassandra1.2文档学习(19)—— CQL索引

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...