Escape

参考:http://blog.csdn.net/libin56842/article/details/41909459

【题意】:
一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y
问这个人能不能安全到达终点
要求: 
1.人不能到达炮塔所在的坐标
2.炮塔会挡住子弹
3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死
4.人可以选择停止不动
 
思路:其实不难,我们只需要看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可。
而标记的话,vis[x][y][time],对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的
 
【代码】
 #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)的更多相关文章

  1. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  2. 【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习

    https://vjudge.net/contest/66569#problem/B 类试题:noip2013 货物运输 POJ 1797 Heavy Transportation 方法一:Dijks ...

  3. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二

    终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...

  4. HDU1560 DNA sequence IDA* + 强力剪枝 [kuangbin带你飞]专题二

    题意:给定一些DNA序列,求一个最短序列能够包含所有序列. 思路:记录第i个序列已经被匹配的长度p[i],以及第i序列的原始长度len[i].则有两个剪枝: 剪枝1:直接取最长待匹配长度.1900ms ...

  5. HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二

    这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...

  6. HDU - 1043 A* + 康托 [kuangbin带你飞]专题二

    这题我第一次用的bfs + ELFhash,直接TLE,又换成bfs + 康托还是TLE,5000ms都过不了!!我一直调试,还是TLE,我才发觉应该是方法的问题. 今天早上起床怒学了一波A*算法,因 ...

  7. [kuangbin带你飞]专题二十二 区间DP

            ID Origin Title   17 / 60 Problem A ZOJ 3537 Cake   54 / 105 Problem B LightOJ 1422 Hallowee ...

  8. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  9. HDU - 3533 bfs [kuangbin带你飞]专题二

    看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...

随机推荐

  1. RSA密码体制

    公钥算法的基本数论知识 公钥密码学中大部分引用了数论的成果,所以必要在介绍RSA密码体制之前,详细介绍一下所使用的几个数论的知识点 欧几里得算法 欧几里得算法主要是解决最大公约数问题,记两个正整数\( ...

  2. Docker 跟 NodeJs 最佳实践

    Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...

  3. java 反射与常用用法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...

  4. Jquery EasyUI远程校验,Jquery EasyUI多个自定义校验,EasyUI自定义校验

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  5. 反射实现 Data To Model

    调用 : public ActionResult Index() { DataTable dt = new DataTable(); dt.Columns.Add("Name"); ...

  6. 自动化利器-YUM仓库搭建实战

    本地YUM仓库搭建实战 YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的reposito ...

  7. Java设计模式GOF之单例模式

    一.单例模式(Singleton) 1.单例模式应用场景: ①Servlet ②任务管理器 ③链接池 ④Spring中每个 bean 默认是单例 ⑤网站计数器 2.单例要求 ①构造器私有 ②私有的静态 ...

  8. C#调用webbrowser,阻止弹出新IE窗口

    本人是用WPF内嵌 winform的webbrowser这种形式开发, 弹出的 //屏蔽弹出新IE窗口 private void webBrowser_NewWindow(object sender, ...

  9. 老李分享:webservice是什么?2

    web service 组件 基本的 web service 平台是 XML + HTTP.所有标准的 web service 使用以下组件: SOAP(简单对象访问协议) UDDI(通用描述.发现与 ...

  10. 08 Noise and Error

    噪声:误标.对同一数据点的标注不一致.数据点信息不准确... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f--->p(y|x),f是p的特殊情况:如 ...