题意:链接

分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状态的值,那么这个数值对应的状态就有四种,BFS搜索即可。之前没有考虑到折回这种情况,原因就是状态没有进行完全的搜索。后面看了网上的写法中多是直接开设了四维的一个状态,只需记录某状态走还是没走,也就没有这种折回的考虑了。

  1. #include <cstdlib>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <queue>
  7. using namespace std;
  8.  
  9. const int N = ;
  10. int n, m, t;
  11. int sx, sy, dx, dy, ex, ey;
  12. char mp[N][N];
  13. int score[N][N];
  14. int dir[][] = {, , , -, , , -, };
  15.  
  16. struct Node {
  17. int x, y, val, ti;
  18. Node() {}
  19. Node(int _x, int _y, int _val, int _ti) : x(_x), y(_y), val(_val), ti(_ti) {}
  20. };
  21.  
  22. inline bool judge(int x, int y) {
  23. if (x < || x > n || y < || y > m) return false;
  24. else return true;
  25. }
  26.  
  27. inline int cal(int x) {
  28. int a = (int)(bool(x/));
  29. int b = (int)(bool(x%));
  30. if (a && b) return ;
  31. else if (a) return ;
  32. else if (b) return ;
  33. else return ;
  34. }
  35.  
  36. int lol[N][N];
  37.  
  38. int solve() {
  39. memset(lol, 0xff, sizeof (lol));
  40. queue<Node>q;
  41. q.push(Node(sx, sy, score[sx][sy], t));
  42. lol[sx][sy] = cal(score[sx][sy]);
  43. while (!q.empty()) {
  44. Node tmp = q.front();
  45. q.pop();
  46. if (lol[tmp.x][tmp.y] == ) return t - tmp.ti;
  47. if (tmp.ti > ) { // 如果还有剩余时间
  48. for (int k = ; k < ; ++k) {
  49. int cx = tmp.x + dir[k][], cy = tmp.y + dir[k][];
  50. int cc = cal(tmp.val + score[cx][cy]);
  51. if (judge(cx, cy) && cc != lol[cx][cy] && mp[cx][cy] == '.') {
  52. lol[cx][cy] = cc;
  53. if (lol[cx][cy] == ) return t-(tmp.ti-);
  54. q.push(Node(cx, cy, tmp.val+score[cx][cy], tmp.ti-));
  55. }
  56. }
  57. }
  58. }
  59. return -;
  60. }
  61.  
  62. int main() {
  63. int T, ca = ;
  64. scanf("%d", &T);
  65. while (T--) {
  66. int cx, cy;
  67. scanf("%d %d %d", &n, &m, &t);
  68. memset(score, , sizeof (score));
  69. for (int i = ; i <= n; ++i) {
  70. scanf("%s", mp[i]+);
  71. for (int j = ; j <= m; ++j) {
  72. if (mp[i][j] == 'S') {
  73. sx = i, sy = j;
  74. mp[i][j] = '.';
  75. } else if (mp[i][j] == 'D') {
  76. dx = i, dy = j;
  77. } else if (mp[i][j] == 'E') {
  78. ex = i, ey = j;
  79. }
  80. }
  81. }
  82. for (int k = ; k < ; ++k) { // 把分数都加到格子上
  83. cx = dx + dir[k][], cy = dy + dir[k][];
  84. while (judge(cx, cy) && mp[cx][cy] == '.') {
  85. score[cx][cy] += ;
  86. cx += dir[k][], cy += dir[k][];
  87. }
  88. cx = ex + dir[k][], cy = ey + dir[k][];
  89. while (judge(cx, cy) && mp[cx][cy] == '.') {
  90. score[cx][cy] += ;
  91. cx += dir[k][], cy += dir[k][];
  92. }
  93. }
  94. printf("Case %d:\n%d\n", ++ca, solve());
  95. }
  96. return ;
  97. }

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

随机推荐

  1. token原理

    token原理1.和session有很大关系哦. jsp生成表单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中.等 ...

  2. 《UML大战需求分析》阅读笔记02

    软件应能真正的对客户的工作提供帮助,只有客户使用并真正对其有用才能说我们做的软件成功了.客户从开始提出需求时到后期的工作过程中,需求总是不停变化的,所以这就需要需求人员对需求领先于客户.所以活用UML ...

  3. Bugzilla说明

    简介 Bugzilla是Mozilla公司向我们提供的一个开源的免费缺陷跟踪工具.作为一个产品缺陷的记录及跟踪工具,它能够为你建立一个完善的Bug跟踪体系,包括报告Bug.查询Bug记录并产生报表.处 ...

  4. DevExpress中的ASPxTreeView 递归显示checknodes并获得选中值

    aspx代码 <dx:ASPxTreeView ID="ASPxTreeView1" runat="server"> </dx:ASPxTre ...

  5. iOS 1-2年经验面试参考题

    Model层: 数据持久化存储方案有哪些? 沙盒的目录结构是怎样的?各自一般用于什么场合? SQL语句问题:inner join.left join.right join的区别是什么? SQLite的 ...

  6. html中嵌入天气预报

    先看效果: html代码: <div id="weather"></div> js代码: function findWeather() { var city ...

  7. 【转】MySQL数据库MyISAM和InnoDB存储引擎的比较

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  8. 调用java rest ful 接口实例

    HttpWebRequest request = WebRequest.Create("http://192.168.0.99:8080/wzh-webservice/rest/login? ...

  9. Java基本语法

    一:跨行 Java变量不能跨行,如:String na me = “张三"; 字符串不能跨行,如:String a = "xxxxxxxxxx yyyyyyyy"; 二: ...

  10. ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

    草图   真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...