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程序提供账户名和密码即可,密码不会被显示,登陆后显 ...
随机推荐
- Arm Cache学习总结
cache,高速缓存,其原始意义是指访问速度比一般随机存取内存(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术. 1.cache映射方式 cache中 ...
- public_brokers
This page is an effort to list the publically-accessible MQTT brokers, often useful for testing and ...
- C#面试基础问题0
传入某个属性的set方法的隐含参数的名称是什么?value,它的类型和属性所声名的类型相同. 如何在C#中实现继承?在类名后加上一个冒号,再加上基类的名称. C#支持多重继承么?不支持.可以用接口来实 ...
- atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性
atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性 1. 授权(权利来源)的5种模式 1 2. 企业的组织机构与管理运作来源于国家的管理...而国家的管理又来源于宗教 ...
- Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结
Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl ...
- KVC之-setValue:forKey:方法实现原理与验证
KVC之-setValue:forKey:方法实现原理与验证 - (void)setValue:(id)value forKey:(NSString *)key方法,实现原理与验证 功能:使用一个字符 ...
- 循环节计算---用到find函数
#include <iostream> #include <algorithm> #include <vector> using namespace std; in ...
- PHPCMS v9.6.0后台getshell
思路来自于 http://www.cnbraid.com/2016/09/18/phpcms/ 这里自己复现了一下,自己写了一下 因为是后台的,还得登陆两次..所以不好用,主要是学习学习 漏洞来自于R ...
- extjs增删改查(自己调用extjs)
jsp页面如下:materialsDetail.jsp <%@ page language="java" import="java.util.*" pag ...
- 内部系统间调用client包的封装方法
1.何为client 公司内部的系统调用,如果采用http直接调用,会非常不方便,而且不规范,接口升级或者变动,系统间的改动也是相当麻烦.所以在系统间采用client的互相调用,调用简单,如下: 获取 ...