【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
参考:http://blog.csdn.net/libin56842/article/details/41909459
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue> using namespace std;
int m,n,k,d; bool vis[][][];
struct castle
{
int t,v;
char c;
}s[][];
struct node
{
int x,y;
int step;
node(int xx,int yy,int ss):x(xx),y(yy),step(ss){}
}; int dir[][]={{,},{-,},{,},{,-},{,}};
void Init()
{
memset(vis,,sizeof(vis));
memset(s,,sizeof(s));
}
bool check(int x,int y)
{
if(x>=&&x<=m&&y>=&&y<=n)
{
return ;
}
return ;
}
void bfs()
{
queue<node> Q;
Q.push(node(,,));
vis[][][]=;
while(!Q.empty())
{
node q=Q.front();
Q.pop();
if(q.step>d)
{
printf("Bad luck!\n");
return;
}
if(q.x==m&&q.y==n)
{
printf("%d\n",q.step);
return;
}
for(int i=;i<;i++)
{
node to=q;
to.x+=dir[i][];
to.y+=dir[i][];
to.step++;
if(!check(to.x,to.y))
{
continue;
}
if(!vis[to.step][to.x][to.y]&&!s[to.x][to.y].t)
{
int life=;
int dis;
//向北寻找 for(int k=to.x-;k>=;k--)
{
if(s[k][to.y].t)
{
if(s[k][to.y].c=='S')
{
dis=to.x-k;
if(dis%s[k][to.y].v)
{
break;
}
int tim=to.step-dis/s[k][to.y].v;
if(tim<)
{
break;
}
if(tim%s[k][to.y].t)
{
break;
}
life=;
break;
}
break;
}
}
if(life)
{
//向南
for(int k=to.x+;k<=m;k++)
{
if(s[k][to.y].t)
{
if(s[k][to.y].c=='N')
{
dis=k-to.x;
if(dis%s[k][to.y].v)
{
break;
}
int tim=to.step-dis/s[k][to.y].v;
if(tim<)
{
break;
}
if(tim%s[k][to.y].t)
{
break;
}
life=;
break;
}
break;
}
}
}
if(life)
{
//向东
for(int k=to.y+;k<=n;k++)
{
if(s[to.x][k].t)
{
if(s[to.x][k].c=='W')
{
dis=k-to.y;
if(dis%s[to.x][k].v)
{
break;
}
int tim=to.step-dis/s[to.x][k].v;
if(tim<)
{
break;
}
if(tim%s[to.x][k].t)
{
break;
}
life=;
break;
}
break;
}
}
}
if(life)
{
//向西
for(int k=to.y-;k>=;k--)
{
if(s[to.x][k].t)
{
if(s[to.x][k].c=='E')
{
dis=to.y-k;
if(dis%s[to.x][k].v)
{
break;
}
int tim=to.step-dis/s[to.x][k].v;
if(tim<)
{
break;
}
if(tim%s[to.x][k].t)
{
break;
}
life=;
break;
}
break;
}
}
}
if(life)
{
vis[to.step][to.x][to.y]=;
Q.push(to);
} } }
} }
int main()
{
while(~scanf("%d%d%d%d",&m,&n,&k,&d))
{
Init(); for(int i=;i<k;i++)
{
char c[];
int t,v,x,y;
scanf("%s%d%d%d%d",c,&t,&v,&x,&y);
s[x][y].c=c[];
s[x][y].t=t;
s[x][y].v=v;
}
bfs();
}
return ;
}
BFS
【教训】
开始的时候是MLE,仔细查看了很久才反应过来,int vis[1005][105][105]数组开大了,1005*105*105/4/1000=44320kb,超出了题目限制32768kb,于是把int改成bool就A了。用sizeof操作符可以查看int占用4个字节,bool占用1个字节。以前做题从来不在意,都混着用.....以后还是要注意点....
【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)的更多相关文章
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习
https://vjudge.net/contest/66569#problem/B 类试题:noip2013 货物运输 POJ 1797 Heavy Transportation 方法一:Dijks ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- HDU1560 DNA sequence IDA* + 强力剪枝 [kuangbin带你飞]专题二
题意:给定一些DNA序列,求一个最短序列能够包含所有序列. 思路:记录第i个序列已经被匹配的长度p[i],以及第i序列的原始长度len[i].则有两个剪枝: 剪枝1:直接取最长待匹配长度.1900ms ...
- HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二
这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...
- HDU - 1043 A* + 康托 [kuangbin带你飞]专题二
这题我第一次用的bfs + ELFhash,直接TLE,又换成bfs + 康托还是TLE,5000ms都过不了!!我一直调试,还是TLE,我才发觉应该是方法的问题. 今天早上起床怒学了一波A*算法,因 ...
- [kuangbin带你飞]专题二十二 区间DP
ID Origin Title 17 / 60 Problem A ZOJ 3537 Cake 54 / 105 Problem B LightOJ 1422 Hallowee ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- HDU - 3533 bfs [kuangbin带你飞]专题二
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...
随机推荐
- RSA密码体制
公钥算法的基本数论知识 公钥密码学中大部分引用了数论的成果,所以必要在介绍RSA密码体制之前,详细介绍一下所使用的几个数论的知识点 欧几里得算法 欧几里得算法主要是解决最大公约数问题,记两个正整数\( ...
- Docker 跟 NodeJs 最佳实践
Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...
- java 反射与常用用法
java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...
- Jquery EasyUI远程校验,Jquery EasyUI多个自定义校验,EasyUI自定义校验
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- 反射实现 Data To Model
调用 : public ActionResult Index() { DataTable dt = new DataTable(); dt.Columns.Add("Name"); ...
- 自动化利器-YUM仓库搭建实战
本地YUM仓库搭建实战 YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的reposito ...
- Java设计模式GOF之单例模式
一.单例模式(Singleton) 1.单例模式应用场景: ①Servlet ②任务管理器 ③链接池 ④Spring中每个 bean 默认是单例 ⑤网站计数器 2.单例要求 ①构造器私有 ②私有的静态 ...
- C#调用webbrowser,阻止弹出新IE窗口
本人是用WPF内嵌 winform的webbrowser这种形式开发, 弹出的 //屏蔽弹出新IE窗口 private void webBrowser_NewWindow(object sender, ...
- 老李分享:webservice是什么?2
web service 组件 基本的 web service 平台是 XML + HTTP.所有标准的 web service 使用以下组件: SOAP(简单对象访问协议) UDDI(通用描述.发现与 ...
- 08 Noise and Error
噪声:误标.对同一数据点的标注不一致.数据点信息不准确... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f--->p(y|x),f是p的特殊情况:如 ...