不愧是kuangbin的搜索进阶,这题没灵感写起来好心酸

思路是预处理所有炮台射出的子弹,以此构造一个三维图(其中一维是时间)

预处理过程就相当于在图中增加了很多不可到达的墙,然后就是一个简单的bfs

此题难点也是预处理过程,还有就是注意可以停在原地也就是有5个方向

然后就是建图用bool类型,不然可能会爆内存。

http://acm.hdu.edu.cn/showproblem.php?pid=3533

AC: 405ms 11608kb

#include<iostream>
#include<sstream>
#include<stack>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<cctype>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#define inf 0x3f3f3f3f
#define N 150 using namespace std; int n,m,ans,energe; //energe所给的总时间
int dir[][]= {{-,},{,-},{,},{,},{,}}; //(0,0)留在原地
bool pic[][][];
struct GUN{
short int x,y;
short int dir; //炮台方向
short int period; //炮台发射子弹的周期
short int velocity; //子弹速度
} gun[];
struct NODE{
short int x,y;
short int eng; //当前所耗时间
}node,temp; void init(int &group) //预处理(参考HUSToj上ID为ENDIF的代码)
{
for(int i=; i<group; ++i)
{
int state=; //子弹走过的路程
int x=gun[i].x;int y=gun[i].y;
int dd=gun[i].dir;
while()
{
++state;
x+=dir[dd][];y+=dir[dd][];
if(x<||x>n||y<||y>m||(!pic[x][y][])) break; //有炮台,子弹会被阻挡
if(!(state%gun[i].velocity)) //如果子弹在整数时间内到达某可达位置
{ //则进行图的预处理(增加不可到达的“墙”)
for(int j=state/gun[i].velocity; j<=energe; j+=gun[i].period)
pic[x][y][j]=false;
}
}
}
} bool bfs()
{
queue<NODE>q;
node.x=; node.y=;
node.eng=;
q.push(node);
while(!q.empty())
{
node=q.front(); q.pop();
if(node.x==n&&node.y==m)
{
ans=node.eng;
return true;
}
if(node.eng==energe) return false;
if(n-node.x+m-node.y>energe-node.eng) continue; //曼哈顿距离剪枝
temp=node;
++temp.eng;
for(int i=; i<; ++i)
{
temp.x=node.x+dir[i][];
temp.y=node.y+dir[i][];
if(temp.x<||temp.x>n||temp.y<||temp.y>m||(!pic[temp.x][temp.y][temp.eng]))
continue;
pic[temp.x][temp.y][temp.eng]=false;
q.push(temp);
}
}
return false;
} int main()
{
//freopen("lxx.txt","r",stdin);
int group;
char ch;
while(scanf("%d%d%d%d",&n,&m,&group,&energe)!=EOF)
{
memset(pic,true,sizeof(pic));
for(int i=; i<group; ++i)
{
scanf(" %c",&ch);
if(ch=='N') gun[i].dir=;
else if(ch=='W') gun[i].dir=;
else if(ch=='S') gun[i].dir=;
else gun[i].dir=;
scanf("%hd%hd%hd%hd",&gun[i].period,&gun[i].velocity,&gun[i].x,&gun[i].y);
for(int j=; j<=energe; ++j)
pic[gun[i].x][gun[i].y][j]=false;
}
init(group);
if(!bfs()) printf("Bad luck!\n");
else printf("%d\n",ans);
}
return ;
}

努力向高级搜索迈进!

HDU3533(Escape)的更多相关文章

  1. java并发编程读书笔记(1)-- 对象的共享

    1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...

  2. 《Thinking in C++》学习笔记(二)【第三章】

    第三章 C++中的C 3.4.4 指针简介 ‘&’运算符:只要在标识符前加上‘&’,就会得出标识符的地址. C和C++有一个专门存放地址的变量类型.这个变量类型叫做指针(pointer ...

  3. Spring boot——logback 基础使用篇(一)

    1 简单日志配置 spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logb ...

  4. Java并发编程实践读书笔记(1)线程安全性和对象的共享

    2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...

  5. Java 理论与实践: 修复 Java 内存模型,第 2 部分(转载)

    在 JSR 133 中 JMM 会有什么改变? 活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型(Java Memory Model, JMM)的公开建议.在本系列文章的 ...

  6. Java并发编程(五):Java线程安全性中的对象发布和逸出

    发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系. 什么是发布?简单来说就是提供一个对象的引用给作用域之外 ...

  7. Java 并发编程(二)对象的公布逸出和线程封闭

    对象的公布与逸出 "公布(Publish)"一个对象是指使对象可以在当前作用域之外的代码中使用.可以通过 公有静态变量.非私有方法.构造方法内隐含引用 三种方式. 假设对象构造完毕 ...

  8. EJS学习(二)之语法规则上

    标签含义 <% %> :'脚本' 标签,用于流程控制,无输出即直接使用JavaScript语言. <%= %>:转义输出数据到模板(输出是转义 HTML 标签)即在后端定义的变 ...

  9. 【学习笔记】Linux基础(二):Linux的基本操作

    二.Linux的基本操作 0.正确的开关机操作 开机和登陆: 安全起见,一般不使用最高权限的root账户登入系统,光立系统时再使用 登录时为login程序提供账户名和密码即可,密码不会被显示,登陆后显 ...

随机推荐

  1. LAMP架构三

    PHP相关配置 1.查找php配置文件/usr/local/php/bin/php -i或者phpinfo() [root@bogon admin]# /usr/local/php/bin/php - ...

  2. DataProtectionConfigurationProvider加密web.config文件

    web.config 文件中经常会包含一些敏感信息,最常见的就是数据库连接字符串了,为了防止该信息泄漏,最好是将相关内容加密. Aspnet_regiis.exe命令已经提供了加密配置文件的方法,系统 ...

  3. 多线程-Thread、Runnable、Callbale、Future

    Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程. package org.github.lujiango; ...

  4. 自己定义滑动删除item的ListView。

    首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法 ...

  5. 创建ajax的过程

    step1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象: step2. 创建一个新的HTTP请求,并指定改HTTP请求的方法.URL以及验证信息: step3. 设置响应HTT ...

  6. What is Web Application Architecture? How It Works, Trends, Best Practices and More

    At Stackify, we understand the amount of effort that goes into creating great applications. That’s w ...

  7. httpd-2.2.22安装

    cgi部分共分三部分:html,cgi和服务器(httpd). 首先介绍httpd安装: 1.  软件包:httpd-2.2.22.tar.gz 系统:3.8.0-44-generic #66~pre ...

  8. Linq Mysql GroupBy语句的问题处理

    语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => n ...

  9. @override 报错问题

    Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@Ove ...

  10. 在pom.xml文件中自定义JDK版本+阿里maven镜像修改

    在学习和开发中 总是修改jdk版本 但是这些配置文件又不想记 在此记录一下 方便查询: <build> <plugins> <!-- 指定jdk --> <p ...