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程序提供账户名和密码即可,密码不会被显示,登陆后显 ...
随机推荐
- UE添加鼠标右键打开
重装了下系统,有一些工具,不用重新安装还是能用的,比如UE.pl/sql,就当是绿色软件了.但是有些在鼠标右键里的功能没有了 ,比如UE的右键打开. 可以这样修改:打开UltraEdit->高级 ...
- join和countDownLatch原理及区别详解
先上结论 原理 join 原理:在当前线程中调用另一个线程线程 thread 的 join() 方法时,会调用该 thread 的 wait() 方法,直到这个 thread 执行完毕(JVM在 ru ...
- css定位positon
值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...
- python3 logging 日志记录模块
#coding:utf-8 import logginglogging.basicConfig(filename='log1.log', format='%(asctime)s -%(name)s-% ...
- mysql主从复制之mysql-proxy实现读写分离
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lansgg.blog.51cto.com/5675165/1242674 本文系 ...
- cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
假设先play长音效a,然后在a播放过程中反复执行:play短音效b,stop b,play b,... 则若a足够长,就会被b打断.而长音效被打断是最不可接受的. a之所以会被打断,推测原因是sim ...
- Codeforces Round #265 (Div. 2) B. Inbox (100500)
Over time, Alexey's mail box got littered with too many letters. Some of them are read, while others ...
- c3p0 一个数据库链接的例子
首先需要准备三个依赖包 c3p0-0.9.5.2.jar.mchange-commons-java-0.2.11.jar.mysql-connector-java-5.1.47.jar 下载链接 ht ...
- iOS图片上传及压缩
提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用.在这里,我们需要过UIImagePickerController类来和用户交互. 使用UIImagePickerContr ...
- 浅谈P2P终结者原理及其突破
P2P终结者按正常来说是个很好的网管软件,但是好多人却拿它来,恶意的限制他人的流量,使他人不能正常上网,下面我们就他的功能以及原理还有突破方法做个详细的介绍! 我们先来看看来自在网上PSP的资料:P2 ...