kuangbin专题 专题二 搜索进阶 Escape HDU - 3533
题目链接: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的更多相关文章
- kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085
题目链接:https://vjudge.net/problem/HDU-3085 题意:有两个鬼和两个人和墙,鬼先走,人再走,鬼每走过的地方都会复制一个新鬼, 但新鬼只能等待旧鬼走完一次行程之后,下一 ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
Escape 参考:http://blog.csdn.net/libin56842/article/details/41909459 [题意]: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消 ...
- kuangbin专题 专题二 搜索进阶 哈密顿绕行世界问题 HDU - 2181
题目链接:https://vjudge.net/problem/HDU-2181 题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发 ...
- kuangbin专题 专题一 简单搜索 Oil Deposits HDU - 1241
题目链接:https://vjudge.net/problem/HDU-1241 题意:问有几个油田,一个油田由相邻的‘@’,组成. 思路:bfs,dfs都可以,只需要遍历地图,遇到‘@’,跑一遍搜索 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- Microsoft .Net Remoting系列专题之二
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
随机推荐
- C#正则表达式的完全匹配、部分匹配及忽略大小写的问题
原文:C#正则表达式的完全匹配.部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方.开方等,分别以类似ABS(表达式),Sin(表达式),AS ...
- JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。
JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码. 适合用于计算器的计算,等. 例子: eval("x=10;y=20;document. ...
- WPF中画蚂蚁线的实现
这是一个比较偏的功能,看了其他的很多博客都没有介绍,最后看自己试出来了. 先上效果图 <Path Data="M 100,240 C 510,300 80,100 300,160 H4 ...
- TP5.0中使用trace调试
1.在项目 的配置文件config.php 配置, 2.在程序中使用trace: 3.在浏览器网页上打开 得到如下图所示:点击 “用户变量”,即可查看使用trace输出的变量 或者我们使用 trace ...
- Play Framework + ReactiveMongo 环境搭建
Play!是一个full-stack(全栈的)Java/Scala Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代W ...
- PyCharm安装MicroPython插件
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 PyCharm可以说是当今最流行的一款Pyth ...
- Model-View-Controller Explained in C++
The Permanent URL is: Model-View-Controller Explained in C++. The Model-View-Controller (MVC) is not ...
- QT字符编码转换,可用于中文内码传输
串口.TCP.UDP传输中文字符时,先将字符串转内码.客户端接收到数据后,将内码转为字符串就OK了 QByteArray CommonFunction::strToInterCode(constQSt ...
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- 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 ...