题目链接:点击查看

题目大意:题意我感觉描述的很不清楚。。是看网上其他大佬的博客总结来的,大意就是我们要从点(0,0)走到点(n,m),然后在一些地方设置了炮塔(炮塔视为墙),可以向一个方向周期性地发射同一速率的炮弹,当炮弹到达某一方格的时间是整数时,说明当我们在这个时间到达这个方格时会被击中,然后我们的行驶路线有五个方向,分别是上下左右和不动,并且可以走之前走过的路,问在上述条件下,我们到达目的地的最短时间是多少

需要补充一点,两个炮弹若中途相遇则可以相互穿过,但是炮弹无法穿过炮塔

题目分析:我们可以发现关于炮塔在某一时间发射的炮弹的位置,该方格是无法供我们行走的,所以我们可以开一个三维的have数组用来储存哪些状态是无法到达的,预处理一下,然后再直接bfs深搜即可,注意因为这个题目中可以回到之前走过的位置,所以我们可以开一个三维的vis数组用来去重,很像之前做过的动态规划+bfs的题目一样,因为这个题目的起点和终点都是固定的,我们可以用曼哈顿距离来比较一下队列中的优先级,就可以用A*算法优化了

上代码吧:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;const int b[5][2]={0,1,0,-1,1,0,-1,0,0,0};bool book[N][N];//储存炮塔位置bool have[N][N][1100];//储存炮弹位置bool vis[N][N][1100];//储存重复位置int n,m,k,time,ans;struct node//储存炮弹信息用
{int t,v,x,y,dir;
}a[N];bool check(int x,int y)//检查边界,注意是从0开始到n/m结束
{if(x<0||y<0||x>n||y>m||book[x][y])return false;return true;
}void init()//预处理炮弹的位置
{for(int i=1;i<=k;i++)//pre{for(int j=0;j<=time;j+=a[i].t)//time{int xx=a[i].x+b[a[i].dir][0];int yy=a[i].y+b[a[i].dir][1];while(check(xx,yy)){int k=abs(xx-a[i].x)+abs(yy-a[i].y);//走了几步 if(k%a[i].v==0)have[xx][yy][j+k/a[i].v]=true;xx+=b[a[i].dir][0];yy+=b[a[i].dir][1];}}}
}struct Node//优先队列用
{int x,y,time,rtime;Node(int X,int Y,int TIME,int RTIME){x=X;y=Y;time=TIME;rtime=RTIME;}bool operator<(const Node& a)const{return time+rtime>a.time+a.rtime;}
};bool A_star()
{priority_queue<Node>q;q.push(Node(0,0,0,n+m));vis[0][0][0]=true;while(!q.empty()){Node cur=q.top();q.pop();if(cur.time>time)return false;if(cur.x==n&&cur.y==m){ans=cur.time;return true;}for(int i=0;i<5;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];int t=cur.time+1;if(!check(xx,yy))continue;if(vis[xx][yy][t])continue;if(have[xx][yy][t])continue;vis[xx][yy][t]=true;int rt=abs(xx-n)+abs(yy-m);q.push(Node(xx,yy,t,rt));}}return false;
}int main()
{while(scanf("%d%d%d%d",&n,&m,&k,&time)!=EOF){memset(book,false,sizeof(book));memset(have,false,sizeof(have));memset(vis,false,sizeof(vis));for(int i=1;i<=k;i++)//读入炮弹信息{char dir[5];scanf("%s",dir);if(dir[0]=='E')a[i].dir=0;else if(dir[0]=='W')a[i].dir=1;else if(dir[0]=='S')a[i].dir=2;else if(dir[0]=='N')a[i].dir=3;scanf("%d%d%d%d",&a[i].t,&a[i].v,&a[i].x,&a[i].y);book[a[i].x][a[i].y]=true;}init();if(A_star())printf("%d\n",ans);elseprintf("Bad luck!\n");}return 0;
}

HDU - 3533 Escape(预处理+A*)相关推荐

  1. [kuangbin]专题二 搜索进阶 Escape HDU - 3533【BFS】

    [题目描述] The students of the HEU are maneuvering for their military training. The red army and the blu ...

  2. HDU 5586 Sum (预处理 + 动态规划)

    题目链接:传送门 题意:给你n个数字,然后你可以对这n个数组的任意一个子区间进行一个操作,\(f(x)=(1890x+143)mod10007\),或者不进行操作,问你怎样操作能使得加和最大解题思路: ...

  3. HDU [P3605] Escape

    二分图多重匹配 改进版的匈牙利,加入了一个cnt数组作为找到增广路的标志 本题有一个重要的优化见注释 #include <iostream> #include <cstdio> ...

  4. hdu 5167 Fibonacci(预处理)

    Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...

  5. HDU - 3605 Escape(二分图多重匹配-网络流最大流+思维建边+状态压缩)

    题目链接:点击查看 题目大意:到世界末日了,现在人们要逃离去其他的星球,现在给出n个人以及m个星球,再给出每个人可以前往的星球,最后给出每个星球的容量,题目问最多能让多少个人逃离 题目分析:这个题读完 ...

  6. HDU 3605 Escape【最大流】

    题意:有n个人,m个星球,要搬家,一些人有特定喜欢的星球,让尽量多的人到星球. 输入n,m 输入n*m矩阵表示 i 人是否喜欢 j 星球 输入m个数字表示星球对人的容量 直接建图会超时,然后我们发现m ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

最新文章

  1. Java注解基本原理
  2. 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
  3. 记一次安装docker的坑
  4. python 定时执行 爬虫 模块_【Python】定时执行网站爬虫
  5. 了解cron以及使用cron定时备份MySQL
  6. 视觉SLAM——英特尔D435i相机内参矩阵标定
  7. ZOJ 1606 Count the Colors (线段数染色)
  8. Matplotlib可视化数据分析图表下(常用图表的绘制、折线图、柱形图、直方图、饼形图、散点图、面积图、热力图、箱形图、3D图表、绘制多个图表、双y轴可视化图表、颜色渐变图)
  9. 使用python进行数据抽样
  10. linux查看显卡温度cpu温度,怎样从指令提示符窗口查看cpu温度
  11. 工业控制系统协议相关的安全问题
  12. 在云服务器重装系统后vscode连不上服务器的解决
  13. 解决VS在Release下编译程序报“应用程序无法启动,应用程序的并行配置不正确”的问题
  14. IDEA安装vue开发插件
  15. 疑难杂症:系统状态正常,LInux双机Pacemaker为什么还要切换?
  16. 原神 android 手柄,如何在手机上流畅体验《原神》,推荐机型和手柄缺一不可
  17. pySpark创建DataFrame的方式
  18. java中的逆变、协变、不变概念讲解转载自http://www.cnblogs.com/en-heng/p/5041124.html,感谢编程路上的前辈们!
  19. 你也会说谎——林宥嘉【说谎】解析
  20. 单元测试中用@Autowired 报null (空指针异常)

热门文章

  1. RabbitMQ的missingQueuesFatal参数
  2. SpringBoot底层注解-@ImportResource导入Spring配置文件
  3. SpringMVC拦截器-快速入门(应用)
  4. Spring AOP在事务中的应用典范
  5. 反射_Class对象功能_获取Constructor
  6. Lambda表达式的基础知识
  7. UCloud想吃科创板的“第一个螃蟹”
  8. struts2 Action 通过Spring管理, 并通过Spring的方式读取配置文件
  9. 【重构】微信小程序倒计时组件
  10. 10-python-字典