开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重;后百度之,学习了二进制状态压缩,其实就用一个二进制数来表示当前状态,然后就可以用简单快速位运算来操作了。

  1. #include<map>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. #include<cstdio>
  6. using namespace std;
  7. char a[30][30];
  8. int mark[30][30][1025]; //判重,坐标+钥匙数,二进制表示,每位代表不同钥匙,1有,0无。
  9. int minn=99999;
  10. int f[4][2]={0,1,0,-1,1,0,-1,0};
  11. struct xy
  12. {
  13. int x,y;
  14. int count; // 已经走的步数
  15. int key; // 对应一个二进制数,如0001,在第一位有一把钥匙。
  16. };
  17. void bfs(xy from,int t,int n,int m)
  18. {
  19. queue<xy>q;
  20. q.push(from);
  21. while(!q.empty())
  22. {
  23. xy cur=q.front();
  24. q.pop();
  25. for(int i=0;i<4;i++)
  26. {
  27. xy next(cur);
  28. next.x+=f[i][0];
  29. next.y+=f[i][1];
  30. if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&a[next.x][next.y]!='*'&&mark[next.x][next.y][next.key]==0)
  31. {
  32.  
  33. if(a[next.x][next.y]>='A'&&a[next.x][next.y]<='J')
  34. {
  35. if((next.key&(1<<(a[next.x][next.y]-'A')))==0)continue; //&的优先级比==低!!按位与来判断有无我这把钥匙
  36. }
  37. next.count++;
  38. if(a[next.x][next.y]>='a'&&a[next.x][next.y]<='j')
  39. {
  40. next.key=next.key|(1<<(a[next.x][next.y]-'a')); //按位或来添加这把钥匙。
  41. }
  42. if(next.count==t){return;}
  43. if(a[next.x][next.y]=='^'){minn=next.count;return;}
  44. q.push(next);
  45. mark[next.x][next.y][next.key]=1;
  46. }
  47. }
  48. }
  49. return;
  50. }
  51. int main()
  52. {
  53. int n,m,t;
  54. while(cin>>n>>m>>t)
  55. {
  56. xy from;
  57. minn=99999;
  58. memset(mark,0,sizeof(mark));
  59. from.count=0;
  60. from.key=0;
  61. for(int i=0;i<n;i++)
  62. for(int j=0;j<m;j++)
  63. {
  64. cin>>a[i][j];
  65. if(a[i][j]=='@'){from.x=i;from.y=j;}
  66. }
  67. bfs(from,t,n,m);
  68. if(minn==99999)cout<<-1<<endl;
  69. else cout<<minn<<endl;
  70. cout<<endl;
  71. }
  72. }

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

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

    好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...

  2. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 3001 Travelling(状态压缩DP+三进制)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...

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

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

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

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

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

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

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

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

  8. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  9. HDU 1429 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...

随机推荐

  1. Vue2.0实现路由

    Vue2.0和1.0实现路由的方法有差别,现在我用Vue 2.0实现路由跳转,话不多说,直接上代码 HTML代码 <div class="tab"> <route ...

  2. css:段落文本两端对齐

    效果图: Css:

  3. 如何正确理解和使用 Activity的4种启动模式

    关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用. Activity的启动模式有4 ...

  4. 判断空间上三个点是否共线问题【找bug篇】

    判断空间上三个点是否在同一直线上[找bug篇] 作者:Vashon 时间:20150601   发布时间:20150718 一.拿到问题,首先分析并理清思路. 判断三点是否在同一条直线上需满足以下几点 ...

  5. 谈谈你对java的理解

    这个题目是考察多个方面 但是要回答出关键点: 1.平台无关性 2.GC 3.语言特性.泛型.反射.lamda 4.面向对象 5.类库 6.异常处理

  6. java文件上传,自动判断文件类型

    public enum FileType { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47&quo ...

  7. vscode 中文设置

    修改设置 语言设置介绍: https://code.visualstudio.com/docs/getstarted/locales 按Ctrl + Shift + P打开命令调色板,然后开始键入“d ...

  8. Angular JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)

    方法一和方法二参考:https://www.cnblogs.com/liugang-vip/p/6857595.html 方法一:my-project/node_modules/.bin 下增大内存( ...

  9. Ubuntu16.04下安装pip

    按照下面的步骤来安装 sudo apt-get install python-setuptools python-dev build-essential 安装python2的pip   (要想好你用p ...

  10. Python Socket详细介绍

    Socket 类型 套接字格式: socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号(默认为0)来创建套接字. socket类型 描述 socket. ...