HDU1072

题意:在有一炸弹(定时6分钟)地图中0是墙
,1是空地,2是起点,3是终点,4是炸弹重置点(重新定时为6),
问能否到达安全到达终于,并求出需要的最小时间.
#include
#include
#include
using namespace std;
int m,n,s[10][10],sx,ex,sy,ey;
struct node
{
    int x,y,time,step;
};
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void BFS()
{
    int i,k,j;
    queueQ;
    node p,q;
    p.x=sx;
    p.y=sy;
    p.step=6;//表示炸弹剩余时间
    p.time=1;//表示已使用时间
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.front();
        Q.pop();
      //  if (q.step<=0) 由于队列的时间不是递减的,因此不能置于此处,(遇到了4就会改变其值)
      //  break;
        if (q.x==ex&&q.y==ey)
        {
            printf ("%d\n",q.time);
            return;
        }
        for (k=0;k<4;++k)
        {
            p=q;
            p.x+=dir[k][0];
            p.y+=dir[k][1];
            p.step=q.step-1;
            if (p.x>=1&&p.y<=m&&p.y>=1&&p.x<=n&&s[p.x][p.y]!=0&&p.step>0)
            {
                if (s[p.x][p.y]==4)
                {
                    s[p.x][p.y]=0;//到达4,就无需在来一次,因为炸弹剩余时间不会增加
                    p.step=6;
                    p.time=q.time+1;
                }
                if (s[p.x][p.y]==1)
                {
                    p.time=q.time+1;
                }
                    Q.push(p);
            }
        }
    }
    printf ("-1\n");
}
int main()
{
    int i,j,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
        {
            scanf("%d",&s[i][j]);
            if (s[i][j]==2)
            sx=i,sy=j;
            if (s[i][j]==3)
            ex=i,ey=j;
        }
        BFS();
    }
    return 0;
}

你可能感兴趣的:(HDU1072)