HDU 3533 BFS

xiaoxiao2021-02-28  96

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; }
转载请注明原文地址: https://www.6miu.com/read-47753.html

最新回复(0)