原题直通车:HDU 4528 小明系列故事——捉迷藏

分析: 标记时加两种状态就行.

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<queue>
  4. #include<cstdio>
  5. using namespace std;
  6.  
  7. const int maxn=101;
  8. char f[maxn][maxn];
  9. int dx[]={0,0,-1,1};
  10. int dy[]={1,-1,0,0};
  11. bool vis[maxn][maxn][2][2];
  12. int n,m,k,ei,ej,di,dj,si,sj;
  13. struct node{
  14. int x,y,time,p,q;
  15. }rt,ne;
  16. void work(node &rt){
  17. bool u;
  18. if(!rt.p&&rt.x==ei){
  19. int a=min(rt.y,ej), b=max(rt.y,ej);
  20. u=false;
  21. for(int i=a+1;i<b;++i)
  22. if(f[ei][i]!='.') u=true;
  23. if(!u)rt.p=1;
  24. }
  25. if(!rt.p&&rt.y==ej){
  26. int a=min(rt.x,ei), b=max(rt.x,ei);
  27. u=false;
  28. for(int i=a+1;i<b;++i)
  29. if(f[i][ej]!='.') u=true;
  30. if(!u)rt.p=1;
  31. }
  32. if(!rt.q&&rt.x==di){
  33. int a=min(rt.y,dj), b=max(rt.y,dj);
  34. u=false;
  35. for(int i=a+1;i<b;++i)
  36. if(f[di][i]!='.')u=true;
  37. if(!u)rt.q=1;
  38. }
  39. if(!rt.q&&rt.y==dj){
  40. int a=min(rt.x,di), b=max(rt.x,di);
  41. u=false;
  42. for(int i=a+1;i<b;++i)
  43. if(f[i][dj]!='.') u=true;
  44. if(!u)rt.q=1;
  45. }
  46. }
  47. int BFS(){
  48. queue<node>M;
  49. rt.x=si, rt.y=sj, rt.time=0, rt.p=0, rt.q=0;
  50. vis[si][sj][0][0]=true;
  51. M.push(rt);
  52. while(!M.empty()){
  53. rt=M.front(); M.pop();
  54. work(rt);
  55. if(rt.p&&rt.q) return rt.time;
  56. for(int i=0;i<4;++i){
  57. ne=rt; ne.x+=dx[i]; ne.y+=dy[i]; ne.time+=1;
  58. if(ne.x<0||ne.x>=n||ne.y<0||ne.y>=m||ne.time>k||f[ne.x][ne.y]!='.') continue;
  59. if(!vis[ne.x][ne.y][ne.p][ne.q]){
  60. M.push(ne);
  61. vis[ne.x][ne.y][ne.p][ne.q]=true;
  62. }
  63. }
  64. }
  65. return -1;
  66. }
  67. int main(){
  68. int T,i,j,t,u,cas=1; scanf("%d",&T);
  69. while(T--){
  70. scanf("%d%d%d",&n,&m,&k);
  71. for(i=0;i<n;++i){
  72. scanf("%s",f[i]);
  73. for(j=0;j<m;++j){
  74. if(f[i][j]=='S') si=i, sj=j,f[i][j]='.';
  75. if(f[i][j]=='E') ei=i, ej=j;
  76. if(f[i][j]=='D') di=i, dj=j;
  77. for(t=0;t<2;++t)
  78. for(u=0;u<2;++u)
  79. vis[i][j][t][u]=false;
  80. }
  81. }
  82. printf("Case %d:\n%d\n",cas++,BFS());
  83. }
  84. return 0;
  85. }

HDU 4528 BFS 小明系列故事——捉迷藏的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解

    思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...

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

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

  8. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

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

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

随机推荐

  1. mysql打印输出转csv格式

    1. mysql打印输出放在input.csv中 2. 执行该文件 <?php $str = file_get_contents("./input.csv"); $str = ...

  2. SQL必知必会 -------- 聚集函数、分组排序

    聚集函数 1.AVG()函数 输入:SELECT AVG(prod_price) AS avg_price FROM Products 输出: 警告:只用于单个列AVG()只能用来确定特定数值列的平均 ...

  3. FileBuffer-ImageBuffer 模拟PE

    这节课的重点是:模拟PE加载过程,按照运行的要求给FileBuffer拉伸放到内存当中,从 FileBuffer 到 ImageBuffer 再到 运行Buffer. PE  加载  过程: 根据si ...

  4. [POJ2749]Building roads(2-SAT)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8153   Accepted: 2772 De ...

  5. 【二分答案】BZOJ2016-Chocolate Eating

    [题目大意] n块巧克力,每次吃可以增加ai点快乐,每天早晨睡觉起来快乐值会减半,求如何使d天睡觉前的最小快乐值最大. [思路] 二分每天的最小快乐值,只要没有达到快乐值就继续吃. 不知道为什么了WA ...

  6. 11.m进制转十进制

    Strlen是字符串有多长就是多长,包括所有的元素和\0这个结束符 题目描述 Description 将m进制数n转化成一个十进制数 m<=16 题目保证转换后的十进制数<=100 输入描 ...

  7. ACM -- 算法小结(八)字符串算法之Manacher算法

    字符串算法 -- Manacher算法 首先介绍基础入门知识,以下这部分来着一贴吧,由于是很久之前看的,最近才整理一下,发现没有保存链接,请原创楼主见谅. //首先:大家都知道什么叫回文串吧,这个算法 ...

  8. [转]ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同

      目录(?)[-] 一PagerTitleStrip Class Overview XML布局文件 重写适配器的getPageTitle函数 变量 初始化 重写CharSequence getPag ...

  9. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力

    C. Bear and Up-Down 题目连接: http://www.codeforces.com/contest/653/problem/C Description The life goes ...

  10. SLVA299A : Load Disconnect ( Input to Output Isolation ) for the TPS61040

    http://www.ti.com/lit/an/slva299a/slva299a.pdf Many boost converters have an external rectifier diod ...