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. RabbitMQ-从基础到实战(1)— Hello RabbitMQ

    转载请注明出处 1.简介 本篇博文介绍了在windows平台下安装RabbitMQ Server端,并用JAVA代码实现收发消息 2.安装RabbitMQ RabbitMQ是用Erlang开发的,所以 ...

  2. 简单的线性M移动平均

    最近在写Python的爬虫爬取全校学生的成绩信息和照片,发现些许问题. python的内存管理机制还没摸透,随着程序的运行,占用内存逐渐增大,料想应该是新开辟的空间未及时释放. 先研究研究算法,为比赛 ...

  3. 10分钟精通SharePoint - SharePoint拓扑结构

    SharePoint服务器角色:前端,应用程序和数据库服务器 应用程序服务:搜索.Office文档.User Profile和App等应用服务器 数据库类型:内容数据库.应用程序数据库和配置数据库 规 ...

  4. 【树莓派】h2数据库操作相关

    之前在树莓派上面操作时候,遇到一些业务方面的bug,和团队中的同事经过多次尝试,但就是难以重现用户现场的问题. 但是问题却实实在在地发生,虽然并不是必然可重现的bug,但是也比较闹心: 发生了问题,也 ...

  5. 配置Windows Server 2012服务器远程连接支持多人同时登陆

    1.运行输入gpedit.msc 进入组策略 2.计算机配置--管理模版--windows组件--远程桌面服务--远程桌面会话主机--连接 3.找到限制连接的数量,启用,并改为100. 4.找到 将远 ...

  6. SpringMVC REST 风格请求介绍及简单实践

    简介 REST 即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越 ...

  7. 查看apache,mysql,nginx,php的编译参数

    查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看m ...

  8. 对Golang有兴趣的朋友,推荐一款go语言Web框架-dotweb

    Go语言,2009年推出,对我个人,2015年下半年,才下定决心正式开始引入使用Go,自此,让我获得了一种全新的开发体验. 在不断的项目过程中,一个开发人员总喜欢堆积一些代码段,由于Go的开源特性,逐 ...

  9. 如何给sublime text3安装汉化包?so easy 哦

    这是我本人亲身测试过的,肯定有效,没用的话怪我咯. 首先安装package control,然后安装汉化包即可,很简单哦!!! 1.安装package control:打开sublime,使用快捷键: ...

  10. MVC学习笔记3 - JsRender

    许多发展平台减少代码和简化维护,使用模板和 HTML5 和 JavaScript 也不例外. JsRender 是一个 JavaScript 库使您可以一次定义一个样板文件结构,并使用它来动态地生成 ...