HDU 3533 BFS

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


你可能感兴趣的:(搜索)