题目链接: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. Redis 一些高级用法

    延迟消息队列 利用 expire keyspace notification Redis 过期时,会向特定的消息队列发送消息,监听该消息队列 在 redis.conf 修改 notify-keyspa ...

  2. jquery子元素过滤器

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. Win10《芒果TV》更新v3.8.50勇敢版:新增短信和扫码登录

    勇敢,是心中最初的信仰,实景科幻实验节目<勇敢的世界>,重装上阵对抗升级,<中餐厅2>皇阿玛圣驾亲临,坐镇中国味道.Win10版<芒果TV>全平台同步更新勇敢版v3 ...

  4. Inno Setup制作最简单的安装程序

    目标就是[把exe程序放到制定目录,然后自动把工程需要的dll放到system32目录下,自动注册注册表.] 实现上述需求,用Inno Setup可以非常方便快捷实现. 安装Inno Setup. 点 ...

  5. 【JDK源码分析】String的存储区与不可变 专题

    <Think in Java>中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”. "=="判断的是两个对象的内存地址是否一样,适用于 ...

  6. PowerDesigner逆向工程导入MYSQL数据库总结(不容易,感谢前者们)

    原文:PowerDesigner逆向工程导入MYSQL数据库总结(不容易,感谢前者们) 参考来源: http://blog.csdn.net/chamtianjiao/article/details/ ...

  7. 国家气象局 天气预报 城市代码(JSON格式)

    如题 { "城市代码": [ { "省": "北京", "市": [ { "市名": "北 ...

  8. postgresql Java JDBC 一次性传入多个参数到 in ( ?) - multple/list parameters

    经常不清楚需要传入多少个参数到 IN () 里面,下面是简单方法: 方法 1 - in ( SELECT * FROM unnest(?)) ) Integer[] ids={1,2,3};      ...

  9. 利用AngularJS实现一个单页应用

    看了下angular 的route,用它做个非常简单的单页面应用,记录一下. 顺便说下,好处是,页面改变时不需要刷新,而每个页面都展现不同的数据.尤其在使用模板页的时候,非常方便. 快速使用Roman ...

  10. Angucomplete —— AngularJS 自动完成输入框

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...