HDU3533(Escape)
不愧是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)的更多相关文章
- java并发编程读书笔记(1)-- 对象的共享
1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...
- 《Thinking in C++》学习笔记(二)【第三章】
第三章 C++中的C 3.4.4 指针简介 ‘&’运算符:只要在标识符前加上‘&’,就会得出标识符的地址. C和C++有一个专门存放地址的变量类型.这个变量类型叫做指针(pointer ...
- Spring boot——logback 基础使用篇(一)
1 简单日志配置 spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logb ...
- Java并发编程实践读书笔记(1)线程安全性和对象的共享
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...
- Java 理论与实践: 修复 Java 内存模型,第 2 部分(转载)
在 JSR 133 中 JMM 会有什么改变? 活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型(Java Memory Model, JMM)的公开建议.在本系列文章的 ...
- Java并发编程(五):Java线程安全性中的对象发布和逸出
发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系. 什么是发布?简单来说就是提供一个对象的引用给作用域之外 ...
- Java 并发编程(二)对象的公布逸出和线程封闭
对象的公布与逸出 "公布(Publish)"一个对象是指使对象可以在当前作用域之外的代码中使用.可以通过 公有静态变量.非私有方法.构造方法内隐含引用 三种方式. 假设对象构造完毕 ...
- EJS学习(二)之语法规则上
标签含义 <% %> :'脚本' 标签,用于流程控制,无输出即直接使用JavaScript语言. <%= %>:转义输出数据到模板(输出是转义 HTML 标签)即在后端定义的变 ...
- 【学习笔记】Linux基础(二):Linux的基本操作
二.Linux的基本操作 0.正确的开关机操作 开机和登陆: 安全起见,一般不使用最高权限的root账户登入系统,光立系统时再使用 登录时为login程序提供账户名和密码即可,密码不会被显示,登陆后显 ...
随机推荐
- CentOS搭建nginx与nginx-rtmp-module搭建流媒体服务器
文章地址:http://blog.csdn.net/zph1234/article/details/52846223 本次搭建流媒体使用的环境是centos 7.0+nginx:让我们一起开始奇妙的流 ...
- Android MimeType的用途以及所有类型
MIME TYPE描述 多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符 ...
- 转:数据库的快照隔离级别(Snapshot Isolation)
数据库的快照隔离级别(Snapshot Isolation) 隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而 ...
- Android USB转串口通信开发基本流程
好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...
- layer弹窗的操作方法
1.首先去http://layer.layui.com/下载插件 2.在网站上有演示说明 3.操作方法如何 <script src="../js/layer/layer.js" ...
- 用js来传参到父网页实现
今天搞了半天,用location.href提交参数到后台,结果php无法接收到参数,这让我找了半天,终于发现原因是本页被另外的主页引用了,最终发现问题出在提交js上,最终用parent.locatio ...
- django学习笔记【003】创建第一个带有model的app
[1]python应用程序要连接mysql有多个驱动程序可供选择: 1.MySQLdb 这个只支持python2.x 所以在这里就不说了: 2.mysqlclient 下载地址 https://pyp ...
- Failure [INSTALL_FAILED_OLDER_SDK] [每件问题100块]
问题描述:链接真机时候出现的问题 解决问题: minSdkVersion 10targetSdkVersion 22 修改这两个值
- Normalize.css做了哪些事情--看代码
博主说:本博客文章来源包括转载,翻译,原创,且在文章内均有标明.鼓励原创,支持创作共享,请勿用于商业用途,转载请注明文章链接.本文链接:http://www.kein.pw/?p=80 /*! nor ...
- Atitit.eclipse git使用
Atitit.eclipse git使用 1. Git vs svn1 1.1. 直接记录快照,而非差异比较1 1.2. Git的patch则不依附于branch,commit和commit之间的关系 ...