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

小明系列故事——捉迷藏

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

Problem Description
  小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。
  一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:
 
 只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被发现的
人获胜,被找到的人下一轮负责找人;如果在规定的时间内一个人都没有找到,则小明失败了,下一轮还是他来找人。现在小明想知道,在规定时间内,自己是否可
以找到所有的人,现在他想请你来帮忙计算一下。
  为了简单起见,把公园看成是n行m列的矩阵,其中’S’表示小明,’D’表示大名,’E’表示
二明,’X’表示障碍物,’.’表示通路。这里,我们把发现定义为,可以直接看到对方,
也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方。并且假设,大明,二明藏好以后就不会再改变位置,小明每个单位时间
可以从当前的位置走到相邻的四个位置之一,并且不会走出公园。
 
Input
测试数据第一行是一个正整数T,表示有T组测试数据。
每一组测试数据首先是三个正整数n,m,t,分别表示行数、列数和规定的时间,接下来n行,每行m个上述的字符,并且保证有且只有一个’S’,一个’E’,一个’D’。

[Technical Specification]
T < 200
3 <= n, m <= 100
0 <= t <= 100

 
Output
每组先输出一行Case c:(c表示当前的组数,从1开始计数);
接下来一行,如果小明可以在规定时间内找到所有的人,则输出最少需要的时间,否则输出-1。
 
Sample Input
3
5 6 3
XXD...
....E.
....X.
....S.
......
5 6 3
XDX...
....E.
......
....S.
......
5 6 8
XXDX..
.XEX..
......
....S.
......
 
Sample Output
Case 1:
-1
Case 2:
3
Case 3:
-1
 
Source

第一次做这种BFS,学了一些东西。主要是参考了syhjh的思路和方法。

总结一下吧:

和普通的宽搜不相同的地方,1,两个目标,2,有步数限制(其实就是个优化咯)

怎么写呢? 结构体中不仅有x,y坐标,time步数,还要有这连个目标是否找到,一个一个的找,宽搜的时候把前一个状态复制过来,结束宽搜的语句就很好写了。然后就是判环(就是不走重复路,mark数组可以4维也可以二维),

然后还有一点很重要,就是样例中的第三个样例,说明了小明不能穿过D,E,所以在初始化的时候就记录下这两个点,然后变为不可走的点。

最后做一下BFS

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. #define MAXN 111
  7. #define inf 1<<30
  8. struct Node
  9. {
  10. int x,y;
  11. int time;
  12. bool tag1,tag2;
  13. };
  14. int n,m,time,ans;
  15. Node st,ed1,ed2;
  16. char maps[MAXN][MAXN];
  17. bool mark[MAXN][MAXN][][];
  18. int dir[][]= {{-,},{,},{,-},{,}};
  19.  
  20. bool Judge(Node &p)
  21. {
  22. int x=p.x,y=p.y;
  23. if(x==ed1.x)
  24. {
  25. for(int i=y+; i<=m; i++)
  26. {
  27. if(ed1.y==i)
  28. {
  29. p.tag1=true;
  30. break;
  31. }
  32. else if(maps[x][i]=='X')break;
  33. }
  34. for(int i=y-; i>=; i--)
  35. {
  36. if(ed1.y==i)
  37. {
  38. p.tag1=true;
  39. break;
  40. }
  41. else if(maps[x][i]=='X')break;
  42. }
  43. }
  44. if(x==ed2.x)
  45. {
  46. for(int i=y+; i<=m; i++)
  47. {
  48. if(ed2.y==i)
  49. {
  50. p.tag2=true;
  51. break;
  52. }
  53. else if(maps[x][i]=='X')break;
  54. }
  55. for(int i=y-; i>=; i--)
  56. {
  57. if(ed2.y==i)
  58. {
  59. p.tag2=true;
  60. break;
  61. }
  62. else if(maps[x][i]=='X')break;
  63. }
  64. }
  65. if(y==ed1.y)
  66. {
  67. for(int i=x+; i<=n; i++)
  68. {
  69. if(ed1.x==i)
  70. {
  71. p.tag1=true;
  72. break;
  73. }
  74. else if(maps[i][y]=='X')break;
  75. }
  76. for(int i=x-; i>=; i--)
  77. {
  78. if(ed1.x==i)
  79. {
  80. p.tag1=true;
  81. break;
  82. }
  83. else if(maps[i][y]=='X')break;
  84. }
  85. }
  86. if(y==ed2.y)
  87. {
  88. for(int i=x+; i<=n; i++)
  89. {
  90. if(ed2.x==i)
  91. {
  92. p.tag2=true;
  93. break;
  94. }
  95. else if(maps[i][y]=='X')break;
  96. }
  97. for(int i=x-; i>=; i--)
  98. {
  99. if(ed2.x==i)
  100. {
  101. p.tag2=true;
  102. break;
  103. }
  104. else if(maps[i][y]=='X')break;
  105. }
  106. }
  107. if(p.tag1&&p.tag2)return true;
  108. return false;
  109. }
  110.  
  111. void bfs()
  112. {
  113. memset(mark,false,sizeof(mark));
  114. queue<Node>Q;
  115. Node p,q;
  116. mark[st.x][st.y][st.tag1][st.tag2]=true;
  117. Q.push(st);
  118. while(!Q.empty())
  119. {
  120. p=Q.front();
  121. Q.pop();
  122. if(Judge(p))ans=min(ans,p.time);
  123. if(p.time>time)continue; ///you hua
  124. for(int i=; i<; i++)
  125. {
  126. q=p;
  127. q.x=p.x+dir[i][];
  128. q.y=p.y+dir[i][];
  129. if(q.x<||q.x>n||q.y<||q.y>m||maps[q.x][q.y]=='X')
  130. continue;
  131. if(!mark[q.x][q.y][q.tag1][q.tag2])
  132. {
  133. mark[q.x][q.y][q.tag1][q.tag2]=true;
  134. q.time++;
  135. Q.push(q);
  136. }
  137. }
  138. }
  139. }
  140.  
  141. int main()
  142. {
  143. int _case,t=;
  144. scanf("%d",&_case);
  145. while(_case--)
  146. {
  147. scanf("%d%d%d",&n,&m,&time);
  148. for(int i=; i<=n; i++)
  149. {
  150. scanf("%s",maps[i]+);
  151. for(int j=; j<=m; j++)
  152. {
  153. if(maps[i][j]=='S')
  154. {
  155. st.x=i,st.y=j,st.tag1=st.tag2=false,st.time=;
  156. }
  157. else if(maps[i][j]=='E')
  158. {
  159. ed1.x=i,ed1.y=j;
  160. maps[i][j]='X';
  161. }
  162. else if(maps[i][j]=='D')
  163. {
  164. maps[i][j]='X';
  165. ed2.x=i,ed2.y=j;
  166. }
  167. }
  168. }
  169. ans=inf;
  170. bfs();
  171. printf("Case %d:\n",t++);
  172. if(ans<=time)
  173. {
  174. printf("%d\n",ans);
  175. }
  176. else
  177. puts("-1");
  178. }
  179. return ;
  180. }

HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)的更多相关文章

  1. 2013腾讯编程马拉松初赛第〇场(HDU 4504)威威猫系列故事——篮球梦

    http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 篮球赛假如我们现在已经知道当前比分 A:B,A代表我方的比分,B代表对方的比分,现在比赛还剩下 ...

  2. 2013腾讯编程马拉松初赛第〇场(HDU 4503) 湫湫系列故事——植树节

    http://acm.hdu.edu.cn/showproblem.php?pid=4503 题目: 已知湫湫的班里共有n个孩子,每个孩子有Bi个朋友(i从1到n),且朋友关系是相互的,如果a小朋友和 ...

  3. 2013腾讯编程马拉松初赛第〇场(3月20日)湫湫系列故事——植树节 HDOJ 4503

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4503 思路:hint from a GOD-COW. 将每一个人模拟成图的一个点,两点连线当且仅当两人是朋 ...

  4. HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)

    http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物.  接下来n行,每行两 ...

  5. 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!

    我以为我会是最坚强的那一个 我还是高估了自己 我以为你会是最无情的那一个 还是我贬低了自己 就算不能够在一起 我还是为你担心 就算你可能听不清 也代表我的心意 那北极星的眼泪 闪过你曾经的眼角迷离 那 ...

  6. 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...

  7. HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)

    pid=4508">http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n開始,表示每天的食物清 ...

  8. 2013腾讯编程马拉松||HDU 4505 小Q系列故事——电梯里的爱情 水水水

    http://acm.hdu.edu.cn/showproblem.php?pid=4505 题目大意: 电梯最开始在0层,并且最后必须再回到0层才算一趟任务结束.假设在开始的时候已知电梯内的每个人要 ...

  9. HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松) 并查集合并区间

    发现这种合并区间的题目还可以这么玩 给你n段时间 然后问没被占用的时间是多少 题目所给的区间是右开的导致我wa 好多人5e5*1440的暴力跑出来的时间居然只是我的两倍 不懂.... 所以并查集并没有 ...

随机推荐

  1. String类型方法

    String类型 //1.返回长度 length var a="lynn_hello"; console.log(a.length); //2.相加 concat() 返回一个新的 ...

  2. 我与 美国作家 21天精通C++ 作者 Rao的对话:

    这就是动力呀!

  3. HDFS简介

    Hadoop是当今最为流行的大数据分析和处理工具. 其最先的思想来源于Google的三篇论文:                            GFS(Google File System):是 ...

  4. Demo13

    this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void o ...

  5. fackbook的Fresco的多种图片加载方法以及解码过程

    上篇文章中我们提到了图片加载其实是用了三条线程,如果没看过的同学可以先了解下这里. fackbook的Fresco的Image Pipeline以及自身的缓存机制 那么今天我们就来探索一下如何在代码中 ...

  6. paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]

    Haar-like矩形遍历检测窗口演示Matlab源代码 clc; clear; close all; % Haar-like特征矩形计算 board = 24 % 检测窗口宽度 num = 24 % ...

  7. 解决无法连接到visual studio开发服务器的问题

    今天vs抽风,调试网站出现下图那样: 然后我开始百度搜索 "无法连接到visual studio开发服务器" 出现很多文章: 打开一篇问题,看了里面的内容, 那个解决办法也不是最好 ...

  8. struts2校验の实现

    1.JSP <%@ page contentType="text/html; charset=utf-8" language="java" errorPa ...

  9. 如何在真机上调试Android应用程序(图文详解)(zz)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/03/11/2953564.html   1.首先将手机设置为调试模式 方法:设置——应用程序——开 ...

  10. [Ubuntu] Ubuntu DNS服务器配置

    服务器IP:10.68.19.61 操作系统:Ubuntu 13.04 DNS程序:Bind9 测试域名:mycloud.com 目标IP:10.68.19.134 配置步骤 1.安装BIND9程序包 ...