HDU 1072 Nightmare

这题重要的走过的点可以走第二次,但是我们会发现当走过4时我们可以标记为0,因为回走是没必要

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct T

{

    int x,y,time,step;        

}q[10024];

int map[12][12],N,M,x,y;

int d[4][2]={ 1,0,0,1,-1,0,0,-1 };

int BFS(  )

{

   int first=0,end=0;

   T t;

   t.step=0;t.time=6;

   t.x=x;t.y=y;

   q[end++]=t;

   while( end>first  )

   {

       if( q[first].time>1 )

       {

           for( int i=0;i<4;i++ )

           {

              int dx=q[first].x+d[i][0];

              int dy=q[first].y+d[i][1];

              if( map[dx][dy]==3 ) 

                 return q[first].step+1;

              if( map[dx][dy]==1 )

              {

                 t.x=dx;t.y=dy;

                 t.time=q[first].time-1;

                 t.step=q[first].step+1;

                 q[end++]=t;

              }     

              if( map[dx][dy]==4 )

              {

                 t.x=dx;t.y=dy;

                 t.time=6;

                 map[dx][dy]=0;

                 t.step=q[first].step+1;

                 q[end++]=t;

              } 

           }    

       }

       first++;      

   }

   return -1;

}

int main()

{

     int T;

     scanf( "%d",&T );

     while( T-- )

     {

        memset( map,0,sizeof( map ) );

        scanf( "%d%d",&N,&M );

        for( int i=1;i<=N; i++ )

        {

           for( int j=1; j<=M ; j++ )

           {

              scanf( "%d",&map[i][j] );

              if( map[i][j] == 2 )

              {

                 x=i;

                 y=j;

              }

           }

        }

        printf( "%d\n",BFS(  ) );

     }

     return 0;  

}

 

的重复走。

你可能感兴趣的:(HDU)