题目链接: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. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

  2. MVVMLight 实现指定Frame控件的导航

    原文:MVVMLight 实现指定Frame控件的导航 在UWP开发中,利用汉堡菜单实现导航是常见的方法.汉堡菜单导航一般都需要新建一个Frame控件,并对其进行导航,但是在MvvmLight框架默认 ...

  3. C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码

    在C++中字符串类的string的模板原型是basic_string template <class _Elem, class traits = char_traits<_Elem> ...

  4. C#串口控制舵机、arduino源码 及C#源码及界面

    原文 C#串口控制舵机.arduino源码 及C#源码及界面 1.舵机原理简介 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压.它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基 ...

  5. 零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上)

    原文:零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上) Visual State Manager中文翻译为视觉状态管理器,这 ...

  6. Win32 Application基本框架

    //程序入口 intAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdSh ...

  7. MySql 小内存优化

    MySql5.6启动内存近500M,如在小型机内存敏感的环境可能较大,下边配置会减少较多内存,至150M以下. performance_schema = OFF innodb_buffer_pool_ ...

  8. 跨越DLL边界传递CRT对象潜在的错误

    跨越DLL边界传递CRT对象潜在的错误 翻译:magictong(童磊)2013年5月 版权:microsoft 原文地址:http://msdn.microsoft.com/en-us/librar ...

  9. serverless 项目配置及创建helloworld应用(二)

    阅读目录 一:学习使用AWS Lambda来作为服务器引擎 二:使用serverless环境搭建 三:创建我们的第一个应用,hello world 服务 回到顶部 一:学习使用AWS Lambda来作 ...

  10. 高并发 Nginx+Lua OpenResty系列(4)——Lua 模块开发

    在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...