思路:

一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改。

注意坑点:S的位置是可以走的

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #define ll long long
  4. using namespace std;
  5. const int N = 100+5;
  6. char mp[N][N];
  7. bool vis[4][N][N];
  8. int X1,Y1,X2,Y2,x,y,n,m,t,to[4][2] = {0,1,0,-1,1,0,-1,0},cnt = 1;
  9. struct node{
  10. int x,y;
  11. int step;
  12. int Find;
  13. };
  14. void update(node &a){
  15. if(a.x == X1 && a.Find != 1){ //等于1不改变状态
  16. int s = min(a.y,Y1) + 1;
  17. int e = max(a.y,Y1) - 1;
  18. int flag = 1;
  19. for(int i = s;i <= e;i++){
  20. if(mp[X1][i] != '.'){
  21. flag = 0;
  22. break;
  23. }
  24. }
  25. if(flag) a.Find = (a.Find == 0? 1 : 3);
  26. }
  27. if(a.x == X2 && a.Find != 2){
  28. int s = min(a.y,Y2) + 1;
  29. int e = max(a.y,Y2) - 1;
  30. int flag = 1;
  31. for(int i = s;i <= e;i++){
  32. if(mp[X2][i] != '.'){
  33. flag = 0;
  34. break;
  35. }
  36. }
  37. if(flag) a.Find = (a.Find == 0? 2 : 3);
  38. }
  39. if(a.y == Y1 && a.Find != 1){
  40. int s = min(a.x,X1) + 1;
  41. int e = max(a.x,X1) - 1;
  42. int flag = 1;
  43. for(int i = s;i <= e;i++){
  44. if(mp[i][Y1] != '.'){
  45. flag = 0;
  46. break;
  47. }
  48. }
  49. if(flag) a.Find = (a.Find == 0? 1 : 3);
  50. }
  51. if(a.y == Y2 && a.Find != 2){
  52. int s = min(a.x,X2) + 1;
  53. int e = max(a.x,X2) - 1;
  54. int flag = 1;
  55. for(int i = s;i <= e;i++){
  56. if(mp[i][Y2] != '.'){
  57. flag = 0;
  58. break;
  59. }
  60. }
  61. if(flag) a.Find = (a.Find == 0? 2 : 3);
  62. }
  63. }
  64. void BFS(){
  65. queue<node> q;
  66. while(!q.empty()) q.pop();
  67. node a,b;
  68. a.x = x,a.y = y,a.Find = 0,a.step = 0;
  69. update(a);
  70. q.push(a);
  71. while(!q.empty()){
  72. a = q.front();q.pop();
  73. if(a.Find == 3 && a.step <= t){
  74. printf("Case %d:\n%d\n",cnt++,a.step);
  75. return;
  76. }
  77. for(int i = 0;i < 4;i++){
  78. b.x = a.x + to[i][0];
  79. b.y = a.y + to[i][1];
  80. if(b.x < 1 || b.y < 1 || b.x > n || b.y > m) continue;
  81. if(mp[b.x][b.y] != '.') continue;
  82. b.Find = a.Find;
  83. update(b);
  84. if(vis[b.Find][b.x][b.y]) continue;
  85. vis[b.Find][b.x][b.y] = true;
  86. b.step = a.step + 1;
  87. q.push(b);
  88. }
  89. }
  90. printf("Case %d:\n-1\n",cnt++);
  91. }
  92. int main(){
  93. int T;
  94. scanf("%d",&T);
  95. while(T--){
  96. scanf("%d%d%d",&n,&m,&t);
  97. for(int i = 1;i <= n;i++){
  98. scanf("%s",mp[i] + 1);
  99. for(int j = 1;j <= m;j++){
  100. if(mp[i][j] == 'D') X1 = i,Y1 = j;
  101. else if(mp[i][j] == 'E') X2 = i,Y2 = j;
  102. else if(mp[i][j] == 'S') x = i,y = j,mp[i][j] = '.';
  103. }
  104. }
  105. memset(vis,0,sizeof(vis));
  106. BFS();
  107. }
  108. return 0;
  109. }

hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解的更多相关文章

  1. hdu4528 小明系列故事——捉迷藏

    Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s ...

  2. HDU-4528 小明系列故事——捉迷藏 BFS模拟

    题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状 ...

  3. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  4. HDU 4528 BFS 小明系列故事——捉迷藏

    原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...

  5. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  6. HDU 4528 小明系列故事――捉迷藏

    广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...

  7. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

随机推荐

  1. router-link params传参

    1.router.js配置 需要在路径后定义上要传的属性名 -->       /:属性名(query方式不需要) { path: '/CreateProgress/:name1', name: ...

  2. android动态设置边框颜色

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  3. 12 jmeter性能测试实战--web程序

    项目背景 项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds 10,循环次数100).分别看20.40.60并 ...

  4. golang语言调试

    https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs https: ...

  5. SVN出现xcrun: error: invalid active developer path(Mac)

    Mac升级了系统,配置PHPStorm的SVN,出现如下错误: 具体提示的内容是:xcrun: error: invalid active developer path (/Library/Devel ...

  6. Mac下PHP7.1+Nginx安装和配置

    https://blog.csdn.net/haiyanggeng/article/details/79186982 PHP:7.1.13Nginx:1.12.2 1. 安装PHP# 添加源brew ...

  7. MUTABLE和IMMUTABLE集合

    Scala 集合类系统地区分了可变的和不可变的集合.可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类,相比之下,永远不会改变.不过,你仍然可以模拟添加 ...

  8. storm并发机制,通信机制,任务提交

    一.storm的并发 (1)Workers(JVMs):在一个物理节点上可以运行一个或多个独立的JVM进程.一个Topology可以包含一个或多个worker(并行的跑在不同的物理机上),所以work ...

  9. notification 是同步的

    所有notification的观察者执行之后,post notification的函数才会往下执行.

  10. Web前端开发推荐阅读书籍、学习课程下载

    转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学 ...