题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1429

题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙。

解题思路

要是没有门和钥匙,而且不能走回头路,就是个简单粗暴的BFS。

有了门之后,就要状态压缩+记忆化搜索。不然这个图会搜死你。

本题的状态压缩基于一个事实:尽管可以走回头路,但是回头是有理由的,你要么开了门,要么拿了钥匙,使状态发生改变。

否则等于多绕了一步,浪费时间,应该及时剪枝。

f[x][y][key]保存的是在(x,y)点,手里钥匙是key(位压缩)的状态。

那么对于门,key&(1<<k)检测当前是否有该门的钥匙。

对于钥匙,key|(1<<k)获得钥匙。

每次push之前,记录一下f[x][y][key]就行了

  1. #include "cstdio"
  2. #include "cstring"
  3. #include "string"
  4. #include "iostream"
  5. #include "queue"
  6. using namespace std;
  7. int n,m,t,sx,sy,ex,ey,f[][][],dir[][]={-,,,,,-,,},ans;
  8. char map[][];
  9. struct status
  10. {
  11. int x,y,dep,key;
  12. status(int x,int y,int dep,int key):x(x),y(y),dep(dep),key(key) {}
  13. };
  14. void bfs(int x,int y)
  15. {
  16. queue<status> Q;
  17. Q.push(status(x,y,,));
  18. f[x][y][]=;
  19. bool flag=false;
  20. while(!Q.empty())
  21. {
  22. if(flag) break;
  23. status t=Q.front();Q.pop();
  24. for(int s=;s<;s++)
  25. {
  26. int X=t.x+dir[s][],Y=t.y+dir[s][],key=t.key;
  27. if(X<||X>n||Y<||Y>m||map[X][Y]=='*') continue;
  28. if(isupper(map[X][Y]))
  29. {
  30. int k=map[X][Y]-'A';
  31. if(!(key&(<<k))) continue;
  32. }
  33. if(islower(map[X][Y]))
  34. {
  35. int k=map[X][Y]-'a';
  36. key=t.key|(<<k);
  37. }
  38. if(f[X][Y][key]) continue;
  39. f[X][Y][key]=;
  40. if(X==ex&&Y==ey) {flag=true;ans=min(ans,t.dep+);}
  41. Q.push(status(X,Y,t.dep+,key));
  42. }
  43. }
  44. }
  45. int main()
  46. {
  47. //freopen("in.txt","r",stdin);
  48. ios::sync_with_stdio(false);
  49. string tt;
  50. while(cin>>n>>m>>t)
  51. {
  52. memset(f,,sizeof(f));
  53. ans=<<;
  54. for(int i=;i<=n;i++)
  55. {
  56. cin>>tt;
  57. for(int j=;j<tt.size();j++)
  58. {
  59. map[i][j+]=tt[j];
  60. if(tt[j]=='@') {sx=i;sy=j+;}
  61. if(tt[j]=='^') {ex=i;ey=j+;}
  62. }
  63. }
  64. bfs(sx,sy);
  65. if(ans<t) cout<<ans<<endl;
  66. else cout<<"-1"<<endl;
  67. }
  68. }
11876984 2014-10-15 13:22:15 Accepted 1429 562MS 3664K 1744 B C++ Physcal

HDU 1429 (BFS+记忆化状压搜索)的更多相关文章

  1. HDU 5025 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...

  2. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...

  3. FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力

    题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...

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

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

  5. hdu 1429 bfs+状压

    题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门 ...

  6. FZU 2092 bfs+记忆化搜索

    晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...

  7. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  8. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  9. 不要62 hdu 2089 dfs记忆化搜索

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...

随机推荐

  1. 静态资源[org.springframework.web.servlet.PageNotFound]

    springmvc 无法访问js.css.jpg等资源文件,tomcat启动报警告如下 [org.springframework.web.servlet.PageNotFound] - No mapp ...

  2. jquery取checkbox选中的值

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. MAC的OS X10.10更新以后进入用户界面就死机

    我用的是搜狗输入法,所以把搜狗卸载就好了.(注意是卸载,不是单纯的从输入源里移除) 下载一个搜狗输入法的DMG,打开后选择卸载搜狗输入法. 转自: http://zhidao.baidu.com/qu ...

  4. jQuery Ajax 操作函数

    jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 描述 jQuery.ajax() 执行异步 H ...

  5. Java for LeetCode 154 Find Minimum in Rotated Sorted Array II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  6. 【python】pathlib库

    pathlib在python3.2以上开始默认支持,在python2.7中如果要使用需要安装 pip install pathlib pathlib更多参考资料:http://pathlib.read ...

  7. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  8. Linux 底下使用C 对文件进行遍历

    #include <stdio.h>#include <stdlib.h>main (int argc,char *argv[]){char ch;FILE *fp;int i ...

  9. MapReduce:详解Shuffle过程(转)

    /** * author : 冶秀刚 * mail     : dennyy99@gmail.com */ Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapRedu ...

  10. mysql php nginx 源码包下载地址

    http://mirror.cogentco.com/pub/mysql/MySQL-5.5/ http://mirrors.sohu.com/php/ http://nginx.org/downlo ...