题意:懒得说了

分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <queue>
#include <set>
using namespace std;
const int N=;
int n,m,k,d,l;
struct node
{
char s[];
int x,y,v,t;
} o[N];
bool mp[N][N];
bool no[N][N][];
void No(int pos)
{
l=;
for(int i=o[pos].x-; i>=; --i)
if(mp[i][o[pos].y])
{
l=i+;
break;
}
for(int i=; i<=d; i+=o[pos].t)
{
int now=o[pos].x-o[pos].v;
for(int j=i+; j<=d&&now>=l; ++j,now-=o[pos].v)
no[now][o[pos].y][j]=;
}
}
void S(int pos)
{
l=n;
for(int i=o[pos].x+; i<=n; ++i)
if(mp[i][o[pos].y])
{
l=i-;
break;
}
for(int i=; i<=d; i+=o[pos].t)
{
int now=o[pos].x+o[pos].v;
for(int j=i+; j<=d&&now<=l; ++j,now+=o[pos].v)
no[now][o[pos].y][j]=;
}
}
void W(int pos)
{
l=;
for(int i=o[pos].y-; i>=; --i)
if(mp[o[pos].x][i])
{
l=i+;
break;
}
for(int i=; i<=d; i+=o[pos].t)
{
int now=o[pos].y-o[pos].v;
for(int j=i+; j<=d&&now>=l; ++j,now-=o[pos].v)
no[o[pos].x][now][j]=;
}
}
void E(int pos)
{
l=m;
for(int i=o[pos].y+; i<=m; ++i)
if(mp[o[pos].x][i])
{
l=i-;
break;
}
for(int i=; i<=d; i+=o[pos].t)
{
int now=o[pos].y+o[pos].v;
for(int j=i+; j<=d&&now<=l; ++j,now+=o[pos].v)
no[o[pos].x][now][j]=;
}
}
struct asd
{
int x,y,w;
} a,e;
int dx[]= {,,,,-};
int dy[]= {,-,,,};
queue<asd>q;
int bfs()
{
while(!q.empty())q.pop();
q.push(asd {,,});
no[][][]=;
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=; i<; ++i)
{
e.x=a.x+dx[i];
e.y=a.y+dy[i];
e.w=a.w+;
if(e.x<||e.x>n||e.y<||e.y>m)continue;
if(e.w>d)continue;
if(mp[e.x][e.y])continue;
if(no[e.x][e.y][e.w])continue;
if(e.x==n&&e.y==m)return e.w;
no[e.x][e.y][e.w]=;
q.push(e);
}
}
return -;
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&k,&d))
{
memset(mp,,sizeof(mp));
memset(no,,sizeof(no));
for(int i=; i<=k; ++i)
{
scanf("%s%d%d%d%d",o[i].s,&o[i].t,&o[i].v,&o[i].x,&o[i].y);
mp[o[i].x][o[i].y]=;
}
int ans=;
if(mp[][]||mp[n][m])
ans=-;
if(ans!=-)
for(int i=; i<=k; ++i)
{
if(o[i].s[]=='N')No(i);
else if(o[i].s[]=='S')S(i);
else if(o[i].s[]=='W')W(i);
else E(i);
}
if(ans!=-)ans=bfs();
if(ans==-)printf("Bad luck!\n");
else printf("%d\n",ans);
}
return ;
}

HDU 3533 Escape BFS搜索的更多相关文章

  1. 【搜索】 HDU 3533 Escape BFS 预处理

    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有en ...

  2. HDU 3533 Escape bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=3533 一道普通的bfs,但是由于代码实现出了bug还是拖了很久甚至对拍了 需要注意的是: 1.人不能经过炮台 2 ...

  3. HDU 3533 Escape (BFS + 预处理)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. HDU 3533 Escape(bfs)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. HDU 3533 Escape(大逃亡)

    HDU 3533 Escape(大逃亡) /K (Java/Others)   Problem Description - 题目描述 The students of the HEU are maneu ...

  6. HDU 3533 Escape(BFS+预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...

  7. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

  8. HDU 1495 非常可乐 BFS搜索

    题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...

  9. hdu 1240:Asteroids!(三维BFS搜索)

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. jvm 参数调优

    FROM: http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html#CMSInitiatingOccupancyFraction ...

  2. ios 保存本地数据的方法

    1. NSString *path = [[NSBundle mainBundle] pathForResource:@"文件名" ofType:@"plist" ...

  3. The 5th Zhejiang Provincial Collegiate Programming Contest------ProblemK:Kinds of Fuwas

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1974 题意:问四个角都有同一个福娃的矩形有多少个. #include<b ...

  4. Stretch a row if data overflows in jasper reports

    My band stretches if necessary with the following conditions, I do not know yours. I have started wi ...

  5. VARCHAR2转换为CLOB碰到ORA-22858错误

    近日工作中发现有一张表的字段类型建错了,本应是BLOB类型却被别人建成了VARCHAR2(200),修改时oracle却提示“ORA-22858 invalid alteration of datat ...

  6. saltstack远程操作WINDOWS的POWERSHELL脚本

    这个东东,花了两天来查找资料和测试,终于算是搞定.作记录: 直接在MASTER上执行的命令: salt '*' cmd.script salt://scripts/windows_task.ps1 a ...

  7. Eclipse字体修改设置

    修改字体 Window -> Preferences -> General -> Appearences -> Colors and Fonts 选择java选项,看到Java ...

  8. 数据段、代码段、堆栈段、BSS段

    在linux中,进程在内存中一般会分为5个段,用来存放从磁盘载入的程序代码,等. 这五个段分别是: BSS段: 通常用来存放程序中未初始化的全局变量的一块内存区域.属于静态内存分配. 问题:全局变量不 ...

  9. jquery获取元素索引值index()方法

    jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的 ...

  10. C#反射机制介绍

    反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.       ...