题意

​ ​ A从棋盘(0,0)前往(m,n)每回合消耗一点能量,地图上有一些碉堡,碉堡周期性发射子弹,子弹沿直线运动,每回合在棋盘上一点,碉堡可以拦住子弹的运动,子弹互相不影响,A在移动过程中不能和碉堡子弹处于同一点,输出最短到终点时间,无法到达输出“Bad luck!”

思路

​ ​ 棋盘上最短路,考虑用BFS或者A*,这题BFS足够

​ ​ 难点在于每走到一点,要计算在当前时刻该点有无子弹。既然碉堡能够挡住子弹,那么每当A走到一点,只需考虑A东西南北方向上最近的四个碉堡。再根据这四个碉堡的朝向以及发射子弹的速度间隔计算当前时刻A所在点有无子弹

代码

/*HDU 3533BFS
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
struct node {int v, t, r, c;char dir;
};
struct spy {int x, y, d;
};
int m, n, k, d;
vector<node> row[105], col[105];
bool vis[105][105][1005];
char dir[5];
bool cmp1(const node& a, const node& b)
{return a.c < b.c;
}
bool cmp2(const node& a, const node& b)
{return a.r < b.r;
}
bool move(int x, int y, int t)
{//x,y:坐标,t:时间if (x < 0 || y < 0 || x > m || y > n) return false;if (vis[x][y][t]) return false;//每个方向上相邻的碉堡的坐标int rl = -1, rr = -1, cu = -1, cd = -1;//row bulletfor (int i = 0; i < row[x].size(); i++){node& c = row[x][i];if (c.c < y) rl = i;else if (c.c == y) return false;else{rr = i;break;}}//西边的碉堡if (rl != -1){node& c = row[x][rl];//判断子弹朝向if (c.dir == 'E'){int dis = y - c.c;//判断子弹能否到达if (!(dis % c.v)){//第一发子弹到达的时间int round = dis / c.v;//判断当前是否有子弹if ((t - round) % c.t == 0) return false;}}}//东边的碉堡if (rr != -1){node& c = row[x][rr];//判断子弹朝向if (c.dir == 'W'){int dis = c.c - y;//判断子弹能否到达if (!(dis % c.v)){//判断当前是否有子弹int round = dis / c.v;if ((t - round) % c.t == 0) return false;}}}//cloumn bulletfor (int i = 0; i < col[y].size(); i++){node& c = col[y][i];if (c.r < x) cu = i;else if (c.r == x) return false;else{cd = i;break;}}//北边if (cu != -1){node& c = col[y][cu];//判断子弹朝向if (c.dir == 'S'){int dis = x - c.r;//判断子弹能否到达if (!(dis % c.v)){//判断当前是否有子弹int round = dis / c.v;if ((t - round) % c.t == 0) return false;}}}//南边if (cd != -1){node& c = col[y][cd];//判断子弹朝向if (c.dir == 'N'){int dis = c.r - x;//判断子弹能否到达if (!(dis % c.v)){//判断当前是否有子弹int round = dis / c.v;if ((t - round) % c.t == 0) return false;}}}vis[x][y][t] = true;return true;
}
int bfs()
{queue<spy> qs;if (move(0, 0, 0)) qs.push({ 0,0,d });else return -1;while (!qs.empty()){spy A = qs.front(); qs.pop();if (m + n - A.x - A.y > A.d) continue;if (A.x == m && A.y == n) return d - A.d;spy tmp = A;tmp.d -= 1;//stayif (move(tmp.x, tmp.y, d - tmp.d)){qs.push(tmp);}//Nif (move(tmp.x - 1, tmp.y, d - tmp.d)){tmp.x -= 1;qs.push(tmp);tmp.x += 1;}//Sif (move(tmp.x + 1, tmp.y, d - tmp.d)){tmp.x += 1;qs.push(tmp);tmp.x -= 1;}//Wif (move(tmp.x, tmp.y - 1, d - tmp.d)){tmp.y -= 1;qs.push(tmp);tmp.y += 1;}//Eif (move(tmp.x, tmp.y + 1, d - tmp.d)){tmp.y += 1;qs.push(tmp);tmp.y -= 1;}}return -1;
}
int main()
{while (~scanf("%d%d%d%d", &m, &n, &k, &d)){for (int i = 0; i < 101; i++){row[i].clear();col[i].clear();}for (int i = 0; i < k; i++){//cin >> dir;scanf("%s", dir);node tmp;tmp.dir = dir[0];//cin >> tmp.t >> tmp.v >> tmp.r >> tmp.c;scanf("%d%d%d%d", &tmp.t, &tmp.v, &tmp.r, &tmp.c);row[tmp.r].push_back(tmp);col[tmp.c].push_back(tmp);}for (int i = 0; i <= m; i++){sort(row[i].begin(), row[i].end(), cmp1);}for (int i = 0; i <= n; i++){sort(col[i].begin(), col[i].end(), cmp2);}memset(vis, 0, sizeof(vis));int ans = bfs();if (ans > 0) printf("%d\n", ans);else printf("Bad luck!\n");}
}

  代码中调用move函数可能导致因为std空间内有同名函数而报错,可以更改函数名或者加上域名限定符

其他

​ ​ debug过程中,写了一个数据产生器

import randomdirlist = ['W', 'E', 'N', 'E']
with open("input.txt", "w") as f:# 组数for kase in range(20):n = int(random.random() * 10) + 2m = int(random.random() * 10) + 2k = int(random.random() * (m * n)) + 1d = m + n + int(random.random() * k)f.write("%d %d %d %d\n" % (n, m, k, d))castle = [(0, 0), ]for i in range(k):index = int(random.random() * 4)dir = dirlist[index]t = int(random.random() * 10) + 1v = int(random.random() * 10) + 1x = int(random.random() * (n + 1))y = int(random.random() * (m + 1))while (x, y) in castle:x = int(random.random() * (n + 1))y = int(random.random() * (m + 1))castle.append((x, y))f.write("%c %d %d %d %d\n" % (dir, t, v, x, y))f.write("\n")

HDU 3533 Escape(BFS)相关推荐

  1. HDU 1104 Remainder (BFS)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...

  2. HDU 1175 连连看(BFS)

    Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线 ...

  3. hdu 1495 非常可乐(BFS)

    题目链接:hdu1495 共有6种操作,x-->y,x-->z,y-->x,y-->z,z-->x,z-->y #include<stdio.h> #i ...

  4. hdu 1869 六度分离(bfs)

    链接 六度分离 题意: 给一张无向关系图,要求两个不直接相邻的人之间最多隔着六个人,问是否满足该条件.仔细考虑一下,其实就是如果两个人之间的距离是否会大于7或者不联通,就是不满足的. 思路: 最短路裸 ...

  5. 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)

    [HDU 2612 Find a Way(BFS)](兼BFS入门笔记) 原题入口: http://acm.hdu.edu.cn/showproblem.php?pid=2612 第一篇在CSDN的博 ...

  6. HDU - 1495 非常可乐(BFS,数学)

    HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...

  7. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  8. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  9. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  10. 【洛谷】马的遍历--广度优先搜索(BFS)

    题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...

最新文章

  1. 互联网送给我们的---“平等互助”
  2. 总结一下qsort()函数的使用与注意
  3. pip3 便捷安装包
  4. 实例化Model的三种方式
  5. MySQL配置大小写敏感报错_mysql表名大小写敏感 - xbuding: watch and learn! - OSCHINA - 中文开源技术交流社区...
  6. hulk入门使用——ddos攻击
  7. Java的全局异常处理(统一异常处理)+登陆拦截鉴权+注解实现记录日志
  8. 5214页PDF的进阶架构师学习笔记,阿里巴巴内部Jetpack宝典意外流出
  9. beaver彼_如何使用Beaver Builder创建自定义WordPress布局
  10. 大规模手机定位采集系统设计
  11. 纯JS实现懒加载+瀑布流布局
  12. ib课程北京国际学校哪里有?
  13. matlab对数函数ln5,ln5(ln55怎么算的求过程)
  14. 给定一个完全由小写英文字母组成的字符串等差递增序列
  15. CycleGAN训练自己的数据集
  16. Android 高德地图绘制线、添加图钉、添加线段纹理
  17. TP-Link企业级路由器TP-R483G搭建IP回流
  18. idea启动项目时,系统资源不足问题
  19. 使用 Yocto Project 构建自定义嵌入式 Linux 发行版
  20. 广义相对论的数学公式 | Mathematical formula of general relativity

热门文章

  1. IMDB电影数据分析
  2. 如何理解邮件中的“CC、PS、FYI”等英文缩写?
  3. Win10系统打开共享文件提示没有权限使用网络资源怎么处理
  4. 滨州学院CSDN高校俱乐部 策划书
  5. EMPLOYEE表的创建与查询
  6. chainlink2022年春季编程马拉松
  7. 蓦然回首,已然踏上编程路
  8. mysql 数据库恢复模式_数据库的恢复模式
  9. 商誉专题RN及H5项目总结
  10. 【程序员(媛)国人之光】知(美)识(色)贩卖贴】非标题党】