HDU 1175 连连看

该题与HDU 1728 逃离迷宫是一样的解题思路http://acm.hdu.edu.cn/showproblem.php?pid=1728;这里我采取的方法还是一直走到底,如果没有路了就代表一定要转完了。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct T

{

   int x,y,turn;

}q[1000024];

int map[1024][1024],n,m,k;

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

int hash[1024][1024];

int inline push( const int x,const int y,const int turn,int end )

{

    T t;

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

    t.turn=turn;

    q[ end++ ] = t;

    return end;    

}

bool inline judge( int x,int y )

{

   if( x>n||x<=0||y>m||y<=0 ) 

     return false;

   else if( map[x][y]==0 )

         return true;

        else return false;    

}

bool inline BFS( int X1,int Y1,int X2,int Y2 )

{

    memset( hash,0,sizeof( hash ) );

    int first=0,end=0;

    end=push( X1, Y1, -1, end );

    hash[X1][Y1]=1;

    while( first< end )

    {

        if( q[first].turn>=2 ) return false;

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

        {

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

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

           int turn=q[first].turn + 1;

           while( judge( dx,dy )||( dx==X2 && dy == Y2 ) ) 

           {

              //    printf( "%d %d\n",dx,dy );

                if( dx==X2 && dy == Y2 && map[dx][dy]==map[X1][Y1] ) 

                    return true;

                if( !hash[dx][dy] )

                {

                  hash[dx][dy]=1;

                  end = push( dx,dy,turn,end );    

                }

                dx += d[i][0];

                dy += d[i][1];       

           }    

        }

        first++;       

    }

    return false;     

}

int main()

{ 

   int x,X1,Y1,X2,Y2;

   while( scanf( "%d%d",&n,&m ),n||m )

   {

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

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

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

       scanf( "%d",&x );

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

      {

          scanf( "%d%d%d%d",&X1,&Y1,&X2,&Y2 );

          if( X1==X2&&Y1==Y2 ) 

            printf( "NO\n" ); 

          else

          {

              if( map[X1][Y1]!=0&&map[X1][Y1]==map[X2][Y2]&&BFS( X1,Y1,X2,Y2 ) )

                printf( "YES\n" ) ;

              else printf( "NO\n" );  

         }  

      }   

   }

   return 0;    

}

 

你可能感兴趣的:(HDU)