HDU 1010 Tempter of the Bone (dfs)

 

 

#include<cstdio>

#include<cmath>

#include<cstring>

#include<iostream>

#include<algorithm>

#include<queue>

using namespace std;

int n,m,t;

int sx,sy;

int ex,ey;

int ok;

char mat[10][10];

int vis[10][10];

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



bool isok1(int x,int y,int step)

{

    //printf("\n\n%d %d %d\n",x,y,step);

    if(ok==1) return false;

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

    if(vis[x][y]==1||mat[x][y]=='X') return false;

    if(mat[x][y]=='D'&&step!=t) return false;

    int mlen= abs(x-ex)+abs(y-ey);

    int alen=t-step; //ans len

    if(alen<0||alen%2!=mlen%2) return false;

    return true;

}

void dfs(int x,int y,int step)

{

   if(ok==1||step>t) return ;

   if(mat[x][y]=='D'&&step==t)

   {

       ok=1;

       return;

   }

   int i;

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

   {

       int tx=x+op[i][0];

       int ty=y+op[i][1];

       int tstep=step+1;

       //printf("%d %d %d\n",tx,ty,tstep);

       if(isok1(tx,ty,tstep))

       {

           vis[tx][ty]=1;

           dfs(tx,ty,tstep);

           vis[tx][ty]=0;

       }

   }

}

int main()

{

    int i,j,k;

    while(scanf("%d%d%d",&n,&m,&t)!=EOF)

    {

        if(n==0&&m==0&&t==0) break;

        ok=0;

        memset(vis,0,sizeof(vis));

        for(i=0;i<n;i++)

        {

            scanf("%s",mat[i]);

            for(j=0;j<m;j++)

            {

                if(mat[i][j]=='S')

                {

                    sx=i;sy=j;

                }

                else if(mat[i][j]=='D')

                {

                    ex=i;ey=j;

                }

            }

        }

        if(isok1(sx,sy,0))

        {

            vis[sx][sy]=1;

            dfs(sx,sy,0);

        }

        if(ok==0)

        {

            printf("NO\n");

        }

        else printf("YES\n");

    }

    return 0;

}

 

你可能感兴趣的:(HDU)