一直在纠结怎么样表示找到了人,,,开始时竟灰笨得设两个BOOL。后来参考别人的可以使用二进制位。

另外,此处有一个剪枝就是,就到达该点之后的状态的found(即找到人的状态)在之前已出现过,可以剪去。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. using namespace std;
  7. bool flag[105][105][4];
  8. char map[105][105];
  9. int see[105][105];
  10. int n,m,lim,sx,sy;
  11.  
  12. int dir[4][2]={
  13. {0,1},
  14. {0,-1},
  15. {1,0},
  16. {-1,0}
  17. };
  18.  
  19. struct Status{
  20. int x,y;
  21. int found,cnt;
  22. Status(){
  23. found=0;
  24. }
  25. };
  26.  
  27. void Init(){
  28. memset(see,0,sizeof(see));
  29. for(int i=1;i<=n;i++){
  30. for(int j=1;j<=m;j++){
  31. if(map[i][j]=='S'){
  32. sx=i,sy=j;
  33. }
  34. if(map[i][j]=='X') continue;
  35. int ii=i,jj=j;
  36. while(jj>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj--;
  37. if(jj>=1&&map[ii][jj]=='D') see[i][j]|=1;
  38. if(jj>=1&&map[ii][jj]=='E') see[i][j]|=2;
  39. ii=i,jj=j;
  40. while(jj<=m&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj++;
  41. if(jj<=m&&map[ii][jj]=='D') see[i][j]|=1;
  42. if(jj<=m&&map[ii][jj]=='E') see[i][j]|=2;
  43. ii=i,jj=j;
  44. while(ii<=n&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii++;
  45. if(ii<=n&&map[ii][jj]=='D') see[i][j]|=1;
  46. if(ii<=n&&map[ii][jj]=='E') see[i][j]|=2;
  47. ii=i,jj=j;
  48. while(ii>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii--;
  49. if(ii>=1&&map[ii][jj]=='D') see[i][j]|=1;
  50. if(ii>=1&&map[ii][jj]=='E') see[i][j]|=2;
  51. }
  52. }
  53. }
  54.  
  55. bool ok(int x,int y){
  56. if(x>=1&&x<=n&&y>=1&&y<=m) return true;
  57. return false;
  58. }
  59.  
  60. bool slove(){
  61. memset(flag,false,sizeof(flag));
  62. Status s,t;
  63. s.x=sx,s.y=sy,s.found=see[s.x][s.y],s.cnt=0;
  64. // cout<<s.found<<endl;
  65. queue<Status>que;
  66. que.push(s);
  67. while(!que.empty()){
  68. s=que.front();
  69. que.pop();
  70. if(s.cnt>lim) return false;
  71. else if(s.found==3){ printf("%d\n",s.cnt); return true; }
  72. flag[s.x][s.y][s.found]=true;
  73. for(int i=0;i<4;i++){
  74. t=s;
  75. t.x=s.x+dir[i][0];
  76. t.y=s.y+dir[i][1];
  77. if(map[t.x][t.y]=='D'||map[t.x][t.y]=='E'||map[t.x][t.y]=='X'||!ok(t.x,t.y)) continue;
  78. t.found|=see[t.x][t.y];
  79. if(flag[t.x][t.y][t.found]) continue;
  80. flag[t.x][t.y][t.found]=true;
  81. t.cnt++;
  82. que.push(t);
  83. }
  84. }
  85. return false;
  86. }
  87.  
  88. int main(){
  89. int T,t=0;
  90. scanf("%d",&T);
  91. while(T--){
  92. scanf("%d%d%d",&n,&m,&lim);
  93. for(int i=1;i<=n;i++)
  94. scanf("%s",map[i]+1);
  95. Init();
  96. printf("Case %d:\n",++t);
  97. if(!slove()){
  98. puts("-1");
  99. }
  100. }
  101. return 0;
  102. }

  

HDU 4528的更多相关文章

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

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

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

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

  3. HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528 小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/O ...

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

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

  5. hdu 4528(搜索好题)

    小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total S ...

  6. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  7. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  8. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  9. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

随机推荐

  1. 【BZOJ 1572】 工作安排

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1572 [算法] 贪心 先将这些工作按截至时间排序 建立一个小根堆,当决策是否完成一项 ...

  2. 原生JS---5

    原生js学习笔记5——BOM操作 什么是BOM BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对 ...

  3. [Apple开发者帐户帮助]六、配置应用服务(1.1)Apple Pay:配置Apple Pay(iOS,watchOS)

    Apple Pay允许用户在您的应用中购买商品和服务.要将Apple Pay 权利添加到您的App ID,请先创建商家标识符,然后启用Apple Pay并创建付款处理证书. 或者,您可以使用Xcode ...

  4. c#,Java aes加密

    1.c#版本 /// <summary> /// Aes加密解密.c#版 /// </summary> public class BjfxEncryptHelper { /// ...

  5. BZOJ 2431 逆序对数列 DP

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...

  6. java线程中断2

    一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.那么不 ...

  7. 1、Visual Studio Code安装及Hello Word

    一.环境初始化 1.下载 Visual Studio Code对应版本安装 2.下载.NET Core 2.0 SDK安装 3.安装Mono Debug   完成后界面如下:       二.创建控制 ...

  8. Assembly之instruction之CMP

    CMP[.W]  Compare source and destinationCMP.B  Compare source and destination Syntax  CMP src,dst or ...

  9. SQL Server存储过程作业(二)

    阶段1:练习——统计某类型客房的入住客人人数 需求说明 使用存储过程统计在指定类型的客房入住客人的总人数 提示: 存储过程的输入参数是指定的客房类型名称 USE Hotel GO --阶段1:查询入住 ...

  10. HTTP协议探索之Cache-Control

    缓存的存与用的控制 Cache-Control指定了请求和响应遵循的缓存机制.好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担. Cache-Contro ...