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[5][2]= {{-1,0},{0,-1},{1,0},{0,1},{0,0}};   //(0,0)留在原地
bool pic[101][101][1001];
struct GUN{
    short int x,y;
    short int dir;          //炮台方向
    short int period;       //炮台发射子弹的周期
    short int velocity;     //子弹速度
} gun[101];
struct NODE{
    short int x,y;
    short int eng;      //当前所耗时间
}node,temp;

void init(int &group)   //预处理(参考HUSToj上ID为ENDIF的代码)
{
    for(int i=0; i<group; ++i)
    {
        int state=0;    //子弹走过的路程
        int x=gun[i].x;int y=gun[i].y;
        int dd=gun[i].dir;
        while(1)
        {
            ++state;
            x+=dir[dd][0];y+=dir[dd][1];
            if(x<0||x>n||y<0||y>m||(!pic[x][y][0])) 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=0; node.y=0;
    node.eng=0;
    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=0; i<5; ++i)
        {
            temp.x=node.x+dir[i][0];
            temp.y=node.y+dir[i][1];
            if(temp.x<0||temp.x>n||temp.y<0||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=0; i<group; ++i)
        {
            scanf(" %c",&ch);
            if(ch==‘N‘) gun[i].dir=0;
            else if(ch==‘W‘) gun[i].dir=1;
            else if(ch==‘S‘) gun[i].dir=2;
            else gun[i].dir=3;
            scanf("%hd%hd%hd%hd",&gun[i].period,&gun[i].velocity,&gun[i].x,&gun[i].y);
            for(int j=0; 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 0;
}

努力向高级搜索迈进!

时间: 2024-12-31 03:30:21

HDU3533(Escape)的相关文章

从头认识多线程-4.1 对象的发布(Publish)、逸出(Escape)以及逸出的解决方案

这一章节我们来讨论一下对象的发布与逸出. 其实在前两个章节我们都有想应的讨论,只不过有一些不用补充的问题,我将会放到这个章节里面去. 1.发布(Publish) 当一个对象能够给其他代码引用. package com.ray.deepintothread.ch04.topic_1; import java.util.HashMap; public class Publish { private HashMap<String, Object> map = null; public HashMap

正则学习(1)--- 基本规则总结

在正则表达式的使用上,俺一直在打游击,是时候来个总结了.由于愚笨等不可抗拒的原因,只能选简单的说,只写下对ASCII编码字符的匹配和php相关的,其他的Unicode的和其他不同流派的,以后碰到了再学习下就行,应付平常的应该够了. 首先需要接受正则的概念,它是用来寻找文本的一种规则,简单的文本检索,比如字符串查找strpos,只是简单的查找某一串字符的出现,只要稍微变动下需求,比如要查找这样5个字符,前面两个是数字,后面3个是字母,且忽略大小写,如果单纯用字符串查找等方法做,显得很麻烦,而用正则

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

对象的发布与逸出 "发布(Publish)"一个对象是指使对象能够在当前作用域之外的代码中使用.可以通过 公有静态变量,非私有方法,构造方法内隐含引用 三种方式. 如果对象构造完成之前就发布该对象,就会破坏线程安全性.当某个不应该发布的对象被发布时,这种情况就被称为逸出(Escape). 下面我们首先来看看一个对象是如何逸出的. 发布对象最简单的方法便是将对象的引用保存到一个共有的静态变量中,以便任何类和线程都能看见对象,如下面代码. public static Set<Stri

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

阅读目录 1 简单日志配置 2 logback的介绍及配置 3 logback的使用 4 sts(spring tool suite)配置彩色日志 5 logback.xml配置示例 回到顶部 1 简单日志配置 spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logback.如果你想用某一种日志框架来进行实现的话,就必须先配置,默认情况下,spring boot使用Log

HTML字符实体(Character Entities),转义字符串(Escape Sequence) 转

为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了. 转义字符串(Escape Sequence)也称字符实体(Character Entity).在HTML中,定义转义字符串的原因有两个: 第一个原因是像“<”和“>”这类符号已经用来表示HTM

HTML字符实体(Character Entities),转义字符串(Escape Sequence)

HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了. 转义字符串(Escape Sequence)也称字符实体(Character Entity).在HT

HTML 转义字符串(Escape Sequence)

为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了. 转义字符串(Escape Sequence)也称字符实体(Character Entity).在HTML中,定义转义字符串的原因有两个:第一个原因是像"<"和">

HTML字符实体(Character Entities)与 转义字符串(Escape Sequence)(转)

为什么要用转义字符串?HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了. 转义字符串(Escape Sequence)也称字符实体(Character Entity).在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标

KVM虚拟化笔记(四)------kvm虚拟机日常管理

一,查看KVM虚拟机配置文件及运行状态 1,KVM虚拟机默认的配置文件路径:/etc/libvirt/qemu/ 而autostart目录是配置kvm虚拟机开机自启动的目录. [[email protected] qemu]# cd /etc/libvirt/qemu [[email protected] qemu]# ll total 24 drwxr-xr-x 2 root root 4096 Feb  2 15:03 autostart      ###开机自启动目录   -rw-----