题目链接: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. MVC 创建强类型视图

    •在ViewModel中创建一个类型 •在Action中为ViewData.Model赋值 •在View中使用"@model类型"设置 14 手动创建强类型视图 •在ViewMod ...

  2. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  3. 怎样解决python dataframe loc,iloc循环处理速度很慢的问题

    怎样解决python dataframe loc,iloc循环处理速度很慢的问题 1.问题说明 最近用DataFrame做大数据 处理,发现处理速度特别慢,追究原因,发现是循环处理时,loc,iloc ...

  4. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  5. 生成view的描述字段列表

    ); declare @field_list nvarchar(max); set @table = N'vwMaterial'; set @field_list = N''; SELECT u.na ...

  6. Qt文档系统分析(解释Qt文档的生成工具与过程)

    写在前面 只要打开Qt Assistant或Qt Creator的Help,或是打开在线版的 http://doc.qt.nokia.com ,Qt的漂亮的文档就会呈现在我们眼前.而且 Qt的文档,长 ...

  7. Qt中连接到同一signal的多个slots的执行顺序问题(现在是看连接顺序,以前是无序的)

    in the order they have been connected 起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. ...

  8. VS2010使用c++、gSOAP创建WebService 图文教程

    VS2010使用c++.gSOAP创建的WebService 图文教程 环境 操作系统:Windows 7gsoap版本:2.8.32C++编译器/开发环境:Visual Studio 2010 gS ...

  9. Codility------CyclicRotation

    Task description A zero-indexed array A consisting of N integers is given. Rotation of the array mea ...

  10. 如何在excel中把汉字转换成拼音

    ---恢复内容开始--- 1.启动Excel 2003(其它版本请仿照操作),打开相应的工作表: 2 2.执行“工具→宏→Visual Basic编辑器”命令(或者直接按“Alt+F11”组合键),进 ...