晚上团队训练赛的题

和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作

当时使用node记录人和影子的位置 然后进行两重for循环来分别改变位置 结果超内存 分析了一下应该是队列超了内存 毕竟如果每个点都存入的话一个点最多可以衍生出25个node 然后t最大为200s 一定会超

之间还发生了一些并不能理解的bug 被逼到最后重构才拿到了一个超内存 名次也不好 急需一个ac来赶上去 简直要烧起来了 侧面反映心理素质还是差一些

当时未能想起来改进的办法 后来百度别人的博客学习了一下记忆化搜索(总感觉以前好像学习过...)

其中有一些很省时间的技巧 例如node中的函数

如果一个点的时间没有被走过(vis=-1)那么就进行搜索它

如果这个点探索过并且小于h 那就覆盖它(之所以不放进队列是因为放进去也没有意义了 拿一次就够了 (如果放进去的话也可以AC不过时间增加一倍) )

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<math.h>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<map>
  7. #include<queue>
  8. using namespace std;
  9. int ma[12][12];
  10. int vis[12][12][12][12][205];
  11. int bs[12][12][205];
  12. char s[15];
  13. int n,m;
  14. int t,v,x,y;
  15. int wan;
  16. int ans;
  17. struct node
  18. {
  19. int x1,x2,y1,y2;
  20. int t;
  21. node(int x1,int y1,int x2,int y2,int t):x1(x1),y1(y1),x2(x2),y2(y2),t(t){}
  22. };
  23. int dx[5]={0,0,0,-1,1};
  24. int dy[5]={1,-1,0,0,0};
  25. void bfs()
  26. {
  27. queue<node >q;
  28. vis[1][1][1][1][0]=0;
  29. q.push(node(1,1,1,1,0));
  30. while(!q.empty())
  31. {
  32. node te=q.front();
  33. q.pop();
  34. if(te.t>200)
  35. break;
  36. for(int i=0;i<5;i++)
  37. {
  38. for(int k=0;k<5;k++)
  39. {
  40. int tt=te.t+1;
  41. int x1=te.x1+dx[i];
  42. int x2=te.x2+dx[k];
  43. int y1=te.y1+dy[i];
  44. int y2=te.y2+dy[k];
  45. if(ma[x1][y1]+ma[x2][y2]<2)
  46. continue;
  47. int h=vis[te.x1][te.y1][te.x2][te.y2][te.t];
  48. h+=bs[x1][y1][tt]+bs[x2][y2][tt];
  49. if(x1==x2&&y1==y2)
  50. h-=bs[x1][y1][tt];
  51. if(h>vis[x1][y1][x2][y2][tt])
  52. {
  53. if(vis[x1][y1][x2][y2][tt]==-1)
  54. {
  55. q.push(node(x1,y1,x2,y2,tt));
  56. }
  57. vis[x1][y1][x2][y2][tt]=h;
  58. ans=max(h,ans);
  59. }
  60. }
  61. }
  62. }
  63. }
  64. int main(){
  65. int tt;
  66. scanf("%d",&tt);
  67. while(tt--)
  68. {
  69. scanf("%d%d",&n,&m);
  70. memset(ma,0,sizeof(ma));
  71. for(int i=1;i<=n;i++)
  72. {
  73. scanf("%s",s);
  74. for(int k=0;k<m;k++)
  75. {
  76. if(s[k]=='.')
  77. {
  78. ma[i][k+1]=1;
  79. }
  80. }
  81. }
  82. int p;
  83. scanf("%d",&p);
  84. ans=0;
  85. memset(vis,-1,sizeof(vis));
  86. memset(bs,0,sizeof(bs));
  87. for(int i=1;i<=p;i++)
  88. {
  89. scanf("%d%d%d%d",&t,&x,&y,&v);
  90. bs[x][y][t]+=v;
  91. }
  92. bfs();
  93. printf("%d\n",ans);
  94. }
  95. }

  

FZU 2092 bfs+记忆化搜索的更多相关文章

  1. FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力

    题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...

  2. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...

  3. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  4. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  5. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  6. csu 最优对称路径(bfs+记忆化搜索)

    1106: 最优对称路径 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Solved: 77[Submit][Status][Web Boar ...

  7. FZU 2092 收集水晶(记忆化搜索)

    Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...

  8. HDU 1429 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...

  9. HDU 1428 漫步校园(记忆化搜索,BFS, DFS)

    漫步校园 http://acm.hdu.edu.cn/showproblem.php?pid=1428 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于 ...

随机推荐

  1. cf112a(水题)

    题目很简单..不过题意好像有点难懂... 题意:判定一个数能否被一个幸运数整除,循环一遍4到n/4,若存在i为幸运数且被n整除输出yes,反之输出no... 代码如下: #include <bi ...

  2. java equals 和 "==" 比较

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  3. Quartus 软件的使用之PLL的使用

    练习使用Altera FPGA 内的 PLL IP核: 思路:将clk_50M倍频到clk_100M,然后观察100M时钟. 1.生成PLL的核例化文件,然后调用. 点击NEXT之后,等一会会跳出如下 ...

  4. php编译报错 configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/

    ➜ php- yum install -y curl-devel

  5. 简单dp的状态转移方程集合

    1.对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数.给定N和K(K<=N<=1000),问N的排列中E值为K的个数. dp[i][j]表示i个数的排列中E值为j ...

  6. Java线程面试题 Top 50

    转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...

  7. 使用AIDL远程调用服务中的方法

    AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...

  8. RequiredFieldValidator 控件 CompareValidator 控件

    RequiredFieldValidator 控件 验证关联控件非空 ControlToValidate 属性用来关联被验证控件 ErrorMEssage 触发控件后显示的错误信息 CompareVa ...

  9. include、include_once与require、require_once区别

    include与require的区别 include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行. <?php include 'no.p ...

  10. PHP 输出表格单元格的数据之用表单的方式;

    echo "<table border=1 class="imagetable" >"; //使用表格格式化数据echo "<for ...