题目链接:https://vjudge.net/problem/HDU-3533

题目分析:

1.人不能经过碉堡;

2.敌军碉堡可能建到我军基地

3.子弹碰到碉堡就没了,说明子弹会被别的城堡给拦截下来,不能透过其他城堡,导致攻击距离减小,这里预处理时要注意

4.人拥有的能量相当于最大时间

5.人可以禁止不动

该题目就是预处理比较麻烦,bfs函数在预处理之后就中规中矩,预处理要细心。。。为了剪枝,可以用曼哈顿距离判断,曼哈顿距离其实很简单,可以百度一下


 #include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std; #define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = ;
int mv_x[] = { , , , -, }; // (1)
int mv_y[] = { , , -, , }; // (2) (1) + (2) 上,下,左,右,不动
bool vis[N][N][]; //是否访问标记
bool shot[N][N][]; //子弹分布标记
bool mp[N][N]; //城堡坐标标记
int n, m, k, d; struct People{
int x, y, cost;//花费
}; struct Castle{
char c;
int t, v, x, y;
int end; //能攻击到的最远坐标
}; Castle castle[N]; //标记城堡位置
inline void init_Castle(){ rep__(i, , k){ cin >> castle[i].c >> castle[i].t >> castle[i].v >> castle[i].x >> castle[i].y; mp[castle[i].x][castle[i].y] = true;
}
} //设置城堡攻击范围
void set_Castle_dis(){ //遍历地图,遇到城堡就结束判断能攻击到的最后坐标
rep__(i, , k){
int j;
if (castle[i].c == 'W'){ castle[i].end = castle[i].y;
for (j = castle[i].y - ; !mp[castle[i].x][j] && j >= ; j--) --castle[i].end; }
else if (castle[i].c == 'E'){ castle[i].end = castle[i].y;
for (j = castle[i].y + ; !mp[castle[i].x][j] && j <= m; j++) ++castle[i].end; }
else if (castle[i].c == 'N'){ castle[i].end = castle[i].x;
for (j = castle[i].x - ; !mp[j][castle[i].y] && j >= ; j--) --castle[i].end; }
else if (castle[i].c == 'S'){ castle[i].end = castle[i].x;
for (j = castle[i].x + ; !mp[j][castle[i].y] && j <= n; j++) ++castle[i].end; }
}
} //设置子弹攻击分布图
void init_shot(){ //在每个城市子弹攻击范围进行子弹分布处理
rep__(i, , k){
int start_t = ;
int j; if (castle[i].c == 'W'){ for (j = castle[i].y - castle[i].v, start_t = ; j >= castle[i].end; j -= castle[i].v,
                                                    start_t += ){
for (int p = start_t; p <= d; p += castle[i].t)
shot[castle[i].x][j][p] = true;
}
}
else if (castle[i].c == 'E'){ for (j = castle[i].y + castle[i].v, start_t = ; j <= castle[i].end; j += castle[i].v,
                                                    start_t += ){
for (int p = start_t; p <= d; p += castle[i].t)
shot[castle[i].x][j][p] = true;
}
}
else if (castle[i].c == 'N'){ for (j = castle[i].x - castle[i].v, start_t = ; j >= castle[i].end; j -= castle[i].v,
                                                    start_t += ){
for (int p = start_t; p <= d; p += castle[i].t)
shot[j][castle[i].y][p] = true;
}
}
else if (castle[i].c == 'S'){
for (j = castle[i].x + castle[i].v, start_t = ; j <= castle[i].end; j += castle[i].v,
                                                    start_t += ){
for (int p = start_t; p <= d; p += castle[i].t)
shot[j][castle[i].y][p] = true;
}
}
}
} //预处理
void pre(){ memset(vis, , sizeof(vis));
memset(shot, , sizeof(shot));
memset(mp, , sizeof(mp)); init_Castle(); //标记城堡位置
set_Castle_dis(); //设置城堡攻击范围
init_shot(); //设置子弹攻击分布图
} //判断是否越界
inline bool check(int x, int y){
return x >= && x <= n && y >= && y <= m;
} //曼哈顿距离优化
inline bool ok(int x, int y, int cost){
return (m + n - x - y <= d - cost);
} void bfs(){ if (mp[][]) { cout << "Bad luck!" << endl; return; } queue<People> que;
que.push(People{ , , }); while (!que.empty()){ People tmp = que.front();
que.pop(); rep__(p, , ){
int dx = tmp.x + mv_x[p];
int dy = tmp.y + mv_y[p];
int dcost = tmp.cost + ; //没越界 没被访问过 不是城堡的位置 子弹在这个时刻不攻击这个点 曼哈顿判断能否到达终点
if (check(dx, dy) && !vis[dx][dy][dcost] && !mp[dx][dy]
                    && !shot[dx][dy][dcost] && ok(dx, dy, dcost)){ if (dx == n && dy == m){ cout << dcost << endl; return; }
vis[dx][dy][dcost] = true;
que.push(People{ dx, dy, dcost });
}
}
} cout << "Bad luck!" << endl;
} int main(){ while (cin >> n >> m >> k >> d){
pre();
bfs();
} return ;
}

kuangbin专题 专题二 搜索进阶 Escape HDU - 3533的更多相关文章

  1. kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085

    题目链接:https://vjudge.net/problem/HDU-3085 题意:有两个鬼和两个人和墙,鬼先走,人再走,鬼每走过的地方都会复制一个新鬼, 但新鬼只能等待旧鬼走完一次行程之后,下一 ...

  2. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  3. 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)

    Escape 参考:http://blog.csdn.net/libin56842/article/details/41909459 [题意]: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消 ...

  4. kuangbin专题 专题二 搜索进阶 哈密顿绕行世界问题 HDU - 2181

    题目链接:https://vjudge.net/problem/HDU-2181 题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发 ...

  5. kuangbin专题 专题一 简单搜索 Oil Deposits HDU - 1241

    题目链接:https://vjudge.net/problem/HDU-1241 题意:问有几个油田,一个油田由相邻的‘@’,组成. 思路:bfs,dfs都可以,只需要遍历地图,遇到‘@’,跑一遍搜索 ...

  6. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  7. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

  8. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  9. Microsoft .Net Remoting系列专题之二

    Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

随机推荐

  1. C#正则表达式的完全匹配、部分匹配及忽略大小写的问题

    原文:C#正则表达式的完全匹配.部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方.开方等,分别以类似ABS(表达式),Sin(表达式),AS ...

  2. JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。

    JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码. 适合用于计算器的计算,等. 例子: eval("x=10;y=20;document. ...

  3. WPF中画蚂蚁线的实现

    这是一个比较偏的功能,看了其他的很多博客都没有介绍,最后看自己试出来了. 先上效果图 <Path Data="M 100,240 C 510,300 80,100 300,160 H4 ...

  4. TP5.0中使用trace调试

    1.在项目 的配置文件config.php 配置, 2.在程序中使用trace: 3.在浏览器网页上打开 得到如下图所示:点击 “用户变量”,即可查看使用trace输出的变量 或者我们使用 trace ...

  5. Play Framework + ReactiveMongo 环境搭建

    Play!是一个full-stack(全栈的)Java/Scala Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代W ...

  6. PyCharm安装MicroPython插件

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 PyCharm可以说是当今最流行的一款Pyth ...

  7. Model-View-Controller Explained in C++

    The Permanent URL is: Model-View-Controller Explained in C++. The Model-View-Controller (MVC) is not ...

  8. QT字符编码转换,可用于中文内码传输

    串口.TCP.UDP传输中文字符时,先将字符串转内码.客户端接收到数据后,将内码转为字符串就OK了 QByteArray CommonFunction::strToInterCode(constQSt ...

  9. 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)

    作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...

  10. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)

    经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengi ...