FZU 2092 bfs+记忆化搜索
晚上团队训练赛的题
和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作
当时使用node记录人和影子的位置 然后进行两重for循环来分别改变位置 结果超内存 分析了一下应该是队列超了内存 毕竟如果每个点都存入的话一个点最多可以衍生出25个node 然后t最大为200s 一定会超
之间还发生了一些并不能理解的bug 被逼到最后重构才拿到了一个超内存 名次也不好 急需一个ac来赶上去 简直要烧起来了 侧面反映心理素质还是差一些
当时未能想起来改进的办法 后来百度别人的博客学习了一下记忆化搜索(总感觉以前好像学习过...)
其中有一些很省时间的技巧 例如node中的函数
如果一个点的时间没有被走过(vis=-1)那么就进行搜索它
如果这个点探索过并且小于h 那就覆盖它(之所以不放进队列是因为放进去也没有意义了 拿一次就够了 (如果放进去的话也可以AC不过时间增加一倍) )
- #include<cstdio>
- #include<iostream>
- #include<math.h>
- #include<cstring>
- #include<algorithm>
- #include<map>
- #include<queue>
- using namespace std;
- int ma[12][12];
- int vis[12][12][12][12][205];
- int bs[12][12][205];
- char s[15];
- int n,m;
- int t,v,x,y;
- int wan;
- int ans;
- struct node
- {
- int x1,x2,y1,y2;
- int t;
- node(int x1,int y1,int x2,int y2,int t):x1(x1),y1(y1),x2(x2),y2(y2),t(t){}
- };
- int dx[5]={0,0,0,-1,1};
- int dy[5]={1,-1,0,0,0};
- void bfs()
- {
- queue<node >q;
- vis[1][1][1][1][0]=0;
- q.push(node(1,1,1,1,0));
- while(!q.empty())
- {
- node te=q.front();
- q.pop();
- if(te.t>200)
- break;
- for(int i=0;i<5;i++)
- {
- for(int k=0;k<5;k++)
- {
- int tt=te.t+1;
- int x1=te.x1+dx[i];
- int x2=te.x2+dx[k];
- int y1=te.y1+dy[i];
- int y2=te.y2+dy[k];
- if(ma[x1][y1]+ma[x2][y2]<2)
- continue;
- int h=vis[te.x1][te.y1][te.x2][te.y2][te.t];
- h+=bs[x1][y1][tt]+bs[x2][y2][tt];
- if(x1==x2&&y1==y2)
- h-=bs[x1][y1][tt];
- if(h>vis[x1][y1][x2][y2][tt])
- {
- if(vis[x1][y1][x2][y2][tt]==-1)
- {
- q.push(node(x1,y1,x2,y2,tt));
- }
- vis[x1][y1][x2][y2][tt]=h;
- ans=max(h,ans);
- }
- }
- }
- }
- }
- int main(){
- int tt;
- scanf("%d",&tt);
- while(tt--)
- {
- scanf("%d%d",&n,&m);
- memset(ma,0,sizeof(ma));
- for(int i=1;i<=n;i++)
- {
- scanf("%s",s);
- for(int k=0;k<m;k++)
- {
- if(s[k]=='.')
- {
- ma[i][k+1]=1;
- }
- }
- }
- int p;
- scanf("%d",&p);
- ans=0;
- memset(vis,-1,sizeof(vis));
- memset(bs,0,sizeof(bs));
- for(int i=1;i<=p;i++)
- {
- scanf("%d%d%d%d",&t,&x,&y,&v);
- bs[x][y][t]+=v;
- }
- bfs();
- printf("%d\n",ans);
- }
- }
FZU 2092 bfs+记忆化搜索的更多相关文章
- FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力
题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...
- HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...
- [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)
题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...
- 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1640 Solved: 962 Description I ...
- csu 最优对称路径(bfs+记忆化搜索)
1106: 最优对称路径 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 371 Solved: 77[Submit][Status][Web Boar ...
- FZU 2092 收集水晶(记忆化搜索)
Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...
- HDU 1429 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...
- HDU 1428 漫步校园(记忆化搜索,BFS, DFS)
漫步校园 http://acm.hdu.edu.cn/showproblem.php?pid=1428 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于 ...
随机推荐
- cf112a(水题)
题目很简单..不过题意好像有点难懂... 题意:判定一个数能否被一个幸运数整除,循环一遍4到n/4,若存在i为幸运数且被n整除输出yes,反之输出no... 代码如下: #include <bi ...
- java equals 和 "==" 比较
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- Quartus 软件的使用之PLL的使用
练习使用Altera FPGA 内的 PLL IP核: 思路:将clk_50M倍频到clk_100M,然后观察100M时钟. 1.生成PLL的核例化文件,然后调用. 点击NEXT之后,等一会会跳出如下 ...
- php编译报错 configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
➜ php- yum install -y curl-devel
- 简单dp的状态转移方程集合
1.对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数.给定N和K(K<=N<=1000),问N的排列中E值为K的个数. dp[i][j]表示i个数的排列中E值为j ...
- Java线程面试题 Top 50
转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...
- 使用AIDL远程调用服务中的方法
AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...
- RequiredFieldValidator 控件 CompareValidator 控件
RequiredFieldValidator 控件 验证关联控件非空 ControlToValidate 属性用来关联被验证控件 ErrorMEssage 触发控件后显示的错误信息 CompareVa ...
- include、include_once与require、require_once区别
include与require的区别 include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行. <?php include 'no.p ...
- PHP 输出表格单元格的数据之用表单的方式;
echo "<table border=1 class="imagetable" >"; //使用表格格式化数据echo "<for ...