【搜索】 HDU 3533 Escape BFS 预处理
要从0,0 点 跑到m,n点 路上会有k个堡垒发射子弹。有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒
能够上下左右或者站着不动 每步都须要消耗能量 一共同拥有eng个能量
先预处理出地图 用三维数组表示mp[x][y][time] time表示该时间的地图上储存不能走的点
然后就是普通BFS
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define cler(arr, val) memset(arr, val, sizeof(arr)) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 66666;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 1101521204; const int mod = 10000007; int m,n,k,eng; struct node { int x,y,v,t,f; }kp[102]; struct node1 { int x,y,step; }; queue<node1>q; int xx[5]={0,-1,1,0,0}; int yy[5]={0,0,0,-1,1}; bool vis[110][110][1009]; bool mp[110][110][1009]; bool point[110][110]; bool inmp(int x,int y) { if(x<0||x>m||y<0||y>n) return false; return true; } int bfs(int x,int y) { node1 front,rear; front.x=x,front.y=y,front.step=0; while(!q.empty()) q.pop(); q.push(front); while(!q.empty()) { front=q.front(); front.step++; q.pop(); for(int i=0;i<5;i++) { int dx=front.x+xx[i],dy=front.y+yy[i]; if(inmp(dx,dy)&&!mp[dx][dy][front.step]&&!point[dx][dy]&&!vis[dx][dy][front.step]) { vis[dx][dy][front.step]=true; if(dx==m&&dy==n) return front.step;//到达终点 if(front.step+1>eng) continue; rear.x=dx,rear.y=dy,rear.step=front.step; q.push(rear); } } } return -1; } int main() { // IN; while(scanf("%d%d%d%d",&m,&n,&k,&eng)!=EOF) { cler(mp,false); cler(vis,false); cler(point,false); for(int i=0;i<k;i++) { char c[3]; scanf("%s%d%d%d%d",c,&kp[i].t,&kp[i].v,&kp[i].x,&kp[i].y); if(c[0]=='N') kp[i].f=1; else if(c[0]=='S') kp[i].f=2; else if(c[0]=='W') kp[i].f=3; else if(c[0]=='E') kp[i].f=4; point[kp[i].x][kp[i].y]=true; } for(int i=0;i<k;i++) { int dx=kp[i].x,dy=kp[i].y,v=kp[i].v,next=kp[i].f; for(int j=1;j<=eng;j++) { int flag=0; dx+=xx[next],dy+=yy[next]; if(!inmp(dx,dy)) break; for(int l=0;l<v;l++)//路上有堡垒 { if(point[dx-xx[next]*l][dy-yy[next]*l]) { flag=1;break; } } if(flag) break; int x=j; while(x<=eng) { mp[dx][dy][x]=true;//标记不能走 x+=kp[i].t; } } } int ans=bfs(0,0); if(ans==-1) printf("Bad luck!\n"); else printf("%d\n",ans); } return 0; }