hdu 3533 搜索+预处理

来源:互联网 发布:win732位安装SQL无反应 编辑:程序博客网 时间:2024/05/18 00:23

题意是给你一个地图,地图里有的点是炮台  炮台每隔一段时间回想固定的方向发射一定速度的炮弹,炮弹不能穿过炮台,炮弹只有只有在整点才能打中人,开始你在(0,0)的位置  问你能不能再规定的时间内走到终点;

最对100个炮台,最多走1000步  很明显   把地图预先处理下  及每个点在某一时间有炮弹  那么人就不能走,  开个3维    来标记,还有  数组必须用bool型的要不然要超类存,


#include<stdio.h>#include<iostream>#include<string.h>#include<queue>using namespace std;int n,m,k,d;bool map[101][101][1001];bool mark[101][101][1001];struct node{    int x,y;    int tt;}a,b;struct Node{    int dir;    int x,y;    int t,v;}bull[110];int dir1[4][2]={-1,0,0,1,1,0,0,-1};int dir[5][2]={0,0,0,1,0,-1,1,0,-1,0};int deal(int x){    int i,j;    int di=bull[x].dir;    int xx,yy;    for(i=1;;i++)    {        xx=bull[x].x+i*dir1[di][0]*bull[x].v;        yy=bull[x].y+i*dir1[di][1]*bull[x].v;        if(xx<0||xx>n||yy<0||yy>m) break;        if(map[xx][yy][0]) break;        int flag=0;        if(di==0)        {            for(j=xx;j<bull[x].x;j++)            if(map[j][bull[x].y][0]) {flag=1;break;}        }        else if(di==1)        {            for(j=bull[x].y+1;j<=yy;j++)            if(map[bull[x].x][j][0]) {flag=1;break;}        }        else if(di==2)        {            for(j=bull[x].x+1;j<=xx;j++)            if(map[j][bull[x].y][0]){flag=1;break;}        }        else if(di==3)        {            for(j=yy;j<bull[x].y;j++)            if(map[bull[x].x][j][0]) {flag=1;break;}        }        if(flag) break;        j=0;        int t=i;        while(t<=d)        {            map[xx][yy][t]=1;            j++;            t=i+j*bull[x].t;        }    }    return 0;    }int bfs(){    a.x=0;    a.y=0;    a.tt=0;    memset(mark,0,sizeof(mark));    queue<node>q;    mark[a.x][a.y][a.tt]=1;    q.push(a);    int i,j;    int flash=0;    while(!q.empty())    {            b=q.front();        q.pop();        //printf("%d %d\n",b.x,b.y);        if(b.x==n&&b.y==m)        {            printf("%d\n",b.tt);            flash=1;            break;        }        for(i=0;i<5;i++)        {            a.x=b.x+dir[i][0];            a.y=b.y+dir[i][1];            a.tt=b.tt+1;            if(n-a.x+m-a.y>d-a.tt) continue;            if(a.x<0||a.x>n||a.y<0||a.y>m) continue;            if(map[a.x][a.y][0]) continue;            if(map[a.x][a.y][a.tt]==0&&mark[a.x][a.y][a.tt]==0)             {                mark[a.x][a.y][a.tt]=1;                q.push(a);            }        }    }    if(!flash) printf("Bad luck!\n");    return 0;}int main(){    int i,j;    while(~scanf("%d%d%d%d",&n,&m,&k,&d))    {        char str[2];        memset(map,0,sizeof(map));        for(i=1;i<=k;i++)        {            scanf("%s",str);            if(str[0]=='N') bull[i].dir=0;            else if(str[0]=='E') bull[i].dir=1;            else if(str[0]=='S') bull[i].dir=2;            else if(str[0]=='W')bull[i].dir=3;            scanf("%d%d",&bull[i].t,&bull[i].v);            scanf("%d%d",&bull[i].x,&bull[i].y);            map[bull[i].x][bull[i].y][0]=1;        }                for(i=1;i<=k;i++)        {            deal(i);        }        bfs();    }    return 0;}    

0 0
原创粉丝点击