HDU 1072 Nightmare【广搜】

分析: 给一个地图,一个人从起点开始,身上有一个定时炸弹,时间为6,每走一步花费一个时间,走到标号为4 的点上时时间重置,

        问从起点到终点最少需要经过多少步。

分析: 直接广搜,加上对状态的判重。。。

View Code
#include<stdio.h>
#include<string.h>
struct node
{
    int x,y,time,step;
}q[1000],st,en,tt,xx;
int f[8]={-1,0,0,1,0,-1,1,0};
int a[10][10];
int b[10][10];
int v[10][10][7];
int main()
{
    int front,rear,t,n,m,i,j,res;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                scanf("%d",&a[i][j]);
                if(a[i][j]==2){ st.x=i; st.y=j; }
                else  if(a[i][j]==3){ en.x=i;  en.y=j; }
            }
        memset(v,0,sizeof(v));
        front=rear=0;
        q[rear].x=st.x;
        q[rear].y=st.y;
        q[rear].time=6;
        q[rear++].step=0;
        v[st.x][st.y][6]=1;
        res=9999;
        while(front<rear)
        {
            xx=q[front++];
            for(i=0;i<4;i++)
            {
                tt.x=xx.x+f[i];
                tt.y=xx.y+f[i+4];
                tt.time=xx.time-1;
                if(tt.x>=1&&tt.x<=n&&tt.y>=1&&tt.y<=m&&a[tt.x][tt.y]&&tt.time>0&&!v[tt.x][tt.y][tt.time])
                {
                    v[tt.x][tt.y][tt.time]=1;
                    tt.step=xx.step+1;
                    if(a[tt.x][tt.y]==4)
                        tt.time=6;
                    if(a[tt.x][tt.y]==3&&tt.step<res)
                        res=tt.step;
                    q[rear++]=tt;
                }
            }
        }
        if(res!=9999)
        printf("%d\n",res);
        else printf("-1\n");
    }
    return 0;
}
posted @ 2012-05-09 20:37  'wind  阅读(231)  评论(0)    收藏  举报