HDU 3533 BFS
来源:互联网 发布:斗鱼刷屏软件 编辑:程序博客网 时间:2024/05/18 00:33
HDU 3533
题意:
一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y
问这个人能不能安全到达终点
要求:
1.人不能到达炮塔所在的坐标
2.炮塔会挡住子弹
3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死
4.人可以选择停止不动
思路:其实不难,我们只需要看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可。
而标记的话,vis[x][y][time],对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的
参考别人的做的,差点T了,注意题目上说简化题意没有 静止不动的情况,但若考虑会wa。
#include <iostream>#include <stdio.h>#include <algorithm>#include <queue>#include <string.h>#include <math.h>using namespace std;int n,m,k,d;int map[110][110];struct castle{ int x,y,v,t; int fx;}pao[110];bool vis[110][110][1100];struct node{ int x,y,step;};int dir[5][2]={ 1,0, -1,0, 0,1, 0,-1, 0, 0};void bfs(){ memset(vis,0,sizeof(vis)); struct node u,v; u.x=0; u.y=0; u.step=0; vis[0][0][0]=1; queue<node> que ; que.push(u); while(!que.empty()) { u=que.front() ; que.pop(); if(u.x==n&&u.y==m) { if(u.step<=d) printf("%d\n",u.step); else printf("Bad luck!\n"); return; } for(int i=0;i<5;++i) { int xx=u.x+dir[i][0],yy=u.y+dir[i][1]; if(xx<0||yy<0||xx>n||yy>m) continue; if(vis[xx][yy][u.step+1]==1||map[xx][yy]!=-1) continue ; bool flag=1; for(int j=xx+1;j<=n;++j) { if(map[j][yy]!=-1) { int id = map[j][yy]; int much = j-xx; int time= u.step+1-(much/pao[id].v); if(pao[id].fx!=1||much%pao[id].v) break; if(time<0) break; if(time%pao[id].t==0) { flag =0; break;} } } if(flag==0) continue; for(int j=xx-1;j>=0;--j) { if(map[j][yy]!=-1) { int id = map[j][yy]; int much = xx-j; int time= u.step+1-(much/pao[id].v); if(pao[id].fx!=3||much%pao[id].v) break; if(time<0) break; if(time%pao[id].t==0) { flag =0; break;} } } if(flag==0) continue; for(int j=yy+1;j<=m;++j) { if(map[xx][j]!=-1) { int id = map[xx][j]; int much = j-yy; int time= u.step+1-(much/pao[id].v); if(pao[id].fx!=4||much%pao[id].v) break; if(time<0) break; if(time%pao[id].t==0) { flag =0; break;} } } if(flag==0) continue; for(int j=yy-1;j>=0;--j) { if(map[xx][j]!=-1) { int id = map[xx][j]; int much = yy-j; int time= u.step+1-(much/pao[id].v); if(pao[id].fx!=2||much%pao[id].v) break; if(time<0) break; if(time%pao[id].t==0) { flag =0; break;} } } if(flag==0) continue; v.x=xx; v.y=yy; v.step=u.step+1; vis[xx][yy][u.step+1]=1; que.push(v); } } printf("Bad luck!\n"); return ;}int main(){ while(scanf("%d%d%d%d",&n,&m,&k,&d)!=EOF) { char s[5]; int t,v,x,y,temp; memset(map,-1,sizeof(map)); for(int i=1;i<=k;++i) { scanf("%s",s); scanf("%d%d%d%d",&t,&v,&x,&y); if(s[0]=='N') temp = 1; else if(s[0]=='E') temp = 2; else if(s[0]=='S') temp = 3; else temp = 4; pao[i].fx=temp; pao[i].x=x; pao[i].y=y; pao[i].t=t; pao[i].v=v; map[x][y]=i; } bfs(); } return 0;}
阅读全文
0 0
- BFS-hdu-3533-Escape
- HDU-3533-Escape(BFS)
- HDU 3533 BFS
- [BFS] HDU 3533
- HDU 3533 Escape(BFS)
- HDU 3533 BFS+优先队列
- 【HDU 3533】Escape(BFS)
- HDU 3533 Escape 预处理+bfs
- HDU bfs
- 【搜索】 HDU 3533 Escape BFS 预处理
- HDU - 3533----Escape(BFS+预处理)
- HDU 3533 Escape (bfs + 预处理 + 剪枝)
- hdu 1175 bfs
- HDU 1072(BFS)
- HDU 1429(BFS )
- hdu 1026(BFS)
- HDU 4039 BFS
- hdu 1312 bfs
- 04.13 三剑客之老二sed命令详解
- springboot1.1.0自定义静态文件配置bug
- SLAM学习——非线性优化
- 【51Nod】1035 最长的循环节
- scala系列知识点总结(变量与普通函数)
- HDU 3533 BFS
- 1-100之间的所有素数的和如何在JSP页面实现 代码如下
- pk10彩票统计代码分享
- Eclipse自动编译问题
- 热门第三方sdk之扫一扫(二维码)
- filter
- 2016年最新苹果开发者账号注册流程详解(公司账号篇)
- 六.消息的交换:direct类型的Exchange(通过消息的routing key比较queue的key)
- windows server2014 安装 Mysql Applying Security出错