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;}


原创粉丝点击