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. JDBC(下)

    1. 预编译sql处理(防止sql注入) -- 创建数据库 CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i -- 创建表 USE jdbc ...

  2. TCP协议之三次握手与四次挥手

    TCP协议是TCP/IP体系中核心一个协议,该协议比起IP协议,ICMP协议,UDP协议都更复杂,因此这篇文章主要分析TCP协议在建立连接和断开连接的时候,状态转移以及报文段的内容. 下面,先放一张T ...

  3. iOS开发之延时执行

    方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch ...

  4. vue学习笔记 概述(一)

    vue里 最常见的 最普遍的用法 应该是 var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' }}) 下面把所有使用方法尽可能列 ...

  5. 关于VO中的Attribute的问题

    对于新手来说,有些时候会遇到VO中的Attribute的各种问题; 总结如下:1,你页面上输入了值,但是点击保存之后值并不能存到数据库,这个是因为该字段在VO中不是基于EO的  2,你将一个VO中的E ...

  6. Struts2基础学习(一)—初识Struts2

      目录 一.什么是Struts2 二.搭建Struts2的开发环境 三.Struts2的配置文件 四.MVC模式 一.什么是Struts2      Struts2是一个非常优秀的MVC框架,由传统 ...

  7. ASP.NET Core MVC和Visual Studio入门

    本教程将教你使用Visual Studio 2017创建 ASP.NET Core MVC web应用程序的基础知识. 安装Visual Studio 2017 和.Net Core 安装Visual ...

  8. C#基础语法(一)

    一.基础语法 1.C#区分大小写,所以myVar和MyVar是两个不同的变量. 2.每个C#可执行文件(如控制台应用程序,Windows应用程序和Windows服务)都必须有一个入口点----Main ...

  9. 利刃 MVVMLight 6:命令基础

    在MVVM Light框架中,事件是WPF应用程序中UI与后台代码进行交互的最主要方式,与传统方式不同,mvvm中主要通过绑定到命令来进行事件的处理, 因此要了解mvvm中处理事件的方式,就必须先熟悉 ...

  10. AOP中的ASPECTJ

    一.准备 1.架包 2.配置文件 二.注解的形式 UserDao.java package cn.itcast.spring.aspectj.annocation; public class User ...