好久没写搜索题了,就当练手吧。

vis[][][1025]第三个维度用来维护不同key持有状态的访问情况。

对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支。

  1. //
  2. // main.cpp
  3. // hdu_1429
  4. //
  5. // Created by Luke on 16/10/8.
  6. // Copyright © 2016年 Luke. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <cstring>
  12. #include <queue>
  13. using namespace std;
  14. int n,m,t;
  15. int ex,ey;
  16. char Map[][];
  17. int bit[];
  18. struct Node
  19. {
  20. int y,x;
  21. int key;
  22. int step;
  23. };
  24. bool vis[][][];
  25. int dir[][]={,,-,,,,,-};
  26. bool ok(Node &te)
  27. {
  28. if(te.step>=t)
  29. return false;
  30. if(te.y<||te.y>=n||te.x<||te.x>=m)
  31. return false;
  32. if(vis[te.y][te.x][te.key])
  33. return false;
  34. if(Map[te.y][te.x]=='*')
  35. return false;
  36. if(Map[te.y][te.x]>='A'&&Map[te.y][te.x]<='J')
  37. {
  38. int fix=bit[Map[te.y][te.x]-'A'];
  39. if(!(fix&te.key))
  40. return false;
  41. }
  42. if(Map[te.y][te.x]>='a'&&Map[te.y][te.x]<='j')
  43. te.key|=bit[Map[te.y][te.x]-'a'];
  44. vis[te.y][te.x][te.key]=;
  45. return true;
  46. }
  47. int bfs(int sy,int sx)
  48. {
  49. queue<Node> q;
  50. q.push((Node){sy,sx,,});
  51. memset(vis,,sizeof(vis));
  52. Node now,nx;
  53. while(!q.empty())
  54. {
  55. now=q.front(),q.pop();
  56. if(now.y==ey&&now.x==ex)
  57. return now.step;
  58. for(int i=;i<;i++)
  59. {
  60. nx=now;
  61. nx.y+=dir[i][],nx.x+=dir[i][];
  62. nx.step++;
  63. if(ok(nx))
  64. q.push(nx);
  65. }
  66. }
  67. return -;
  68. }
  69. int main(int argc, const char * argv[]) {
  70. cin.sync_with_stdio(false);
  71. bit[]=;
  72. for(int i=;i<;i++)
  73. bit[i]=bit[i-]<<;
  74. while(cin>>n>>m>>t)
  75. {
  76. int sx,sy;
  77. bool fix[];
  78. memset(fix,,sizeof(fix));
  79. for(int i=;i<n;i++)
  80. for(int j=;j<m;j++)
  81. {
  82. cin>>Map[i][j];
  83. if(Map[i][j]>='A'&&Map[i][j]<='J')
  84. fix[Map[i][j]-'A']=;
  85. if(Map[i][j]=='^')
  86. ex=j,ey=i;
  87. if(Map[i][j]=='@')
  88. sx=j,sy=i;
  89. }
  90. for(int i=;i<n;i++)
  91. for(int j=;j<m;j++)
  92. if(Map[i][j]>='a'&&Map[i][j]<='j')
  93. if(!fix[Map[i][j]-'a'])
  94. Map[i][j]='.';
  95. cout<<bfs(sy,sx)<<endl;
  96. }
  97. return ;
  98. }

BFS+二进制状态压缩 hdu-1429的更多相关文章

  1. hdu 1429 bfs+二进制状态压缩

    开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重:后百度之,学习了二进制状态压缩,其实就用一个二进制数来 ...

  2. POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53312   Accepted: 16050 Des ...

  3. # 最短Hamilton路径(二进制状态压缩)

    最短Hamilton路径(二进制状态压缩) 题目描述:n个点的带权无向图,从0-n-1,求从起点0到终点n-1的最短Hamilton路径(Hamilton路径:从0-n-1不重不漏的每个点恰好进过一次 ...

  4. HDU 3681 Prison Break(BFS+二分+状态压缩DP)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

  5. leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)

    题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...

  6. Fiber Network ZOJ 1967(Floyd+二进制状态压缩)

    Description Several startup companies have decided to build a better Internet, called the "Fibe ...

  7. 二进制状态压缩dp(旅行商TSP)POJ3311

    http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  8. hdu Swipe Bo(bfs+状态压缩)错了多次的题

    Swipe Bo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成

    昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路.后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透, ...

随机推荐

  1. mysql 的delete from 和update子查询限制

    最经做项目时发现的问题,好像在update时也有... 网上查到的资料如下: 1.使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表,会出现错误. ...

  2. expr的字符串操作 表达式: length, index, match, substr等

    参考: http://www.linuxidc.com/Linux/2012-04/58095.htm expr的格式, 主要有两个, 一是 用expr option, 选项: 二是, expr的几个 ...

  3. POJ 1904 King's Quest(强连通图)题解

    题意:n个王子有自己喜欢的ki个公主,有n个公主,每个王子只能娶一个自己喜欢的公主且不能绿别的王子.现在给你一种王子娶公主的方案,并且保证这种方案是正确的.请你给出,每个王子能娶哪些公主,要求娶这些公 ...

  4. .net core mvc 错误信息显示 ModelState.AddModelError

    关于ModelState.AddModelError错误信息不在前端页面显示问题.经过一位高人指定终于知道了为什么,在次写着警示自己看文档一定要仔细.再次感谢这为兄弟 https://www.cnbl ...

  5. entity framework浅谈

    1. 什么是EF 微软提供的ORM工具. ORM让开发人员节省数据库访问代码的时间. 将更多的时间放在业务逻辑层面上. 开发人员使用linq语言, 对数据库进行操作. 2. EF的使用场景 EF有三种 ...

  6. dhcp、tftp及pxe简介

    DHCP: 全称:Dynamic Host Configuration Protocol  动态主机配置协议 DHCP配置内容: IP/Netmask Gateway DNS Server bootp ...

  7. 改变input中的placeholder样式

    1.input[placeholder]{ color:#d5d5d5; } 2.input::-moz-placeholder { color: #d5d5d5; } input:-ms-input ...

  8. Java Object类及其equals方法

    基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超 ...

  9. Oracle(转换函数)

    在数据库中主要使用数据类型:字符,数字,日期(时间戳),所以这三种数据类型之间需要实现转换操作. 常用转换函数: 3.1.TO_CHAR()函数 将数据类型变为字符串. 日期格式化标记: 在TO_CH ...

  10. django 聚合内容 RSS/Atom

    Django提供了一个高层次的聚合内容框架,让我们创建RSS/Atom变得简单,你需要做的只是编写一个简单的Python类. 一.范例 要创建一个feed,只需要编写一个Feed类,然后设置一条指向F ...