hdu 1010 Tempter of the Bone

一般来说迷宫题都是用广搜做的,这次刚写这道题的时候也是用的广搜,后来发现广搜行不通,用深搜反而特别方便,用了深搜后无限TLE,自己试了几组数据,比如六行六列的‘.’,开头和结尾是‘S’,‘D’,这样的话若步数是奇数,要搜好多次,自己试了发,若t=35的话,要搜6000W次,绝对超,后来看别人博客才明白,比较之后,若其差为奇数,肯定搜不到。稍微改了下,交了发,果断AC。

#include<cstdio>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;
char a[10][10];
int xx,yy,t,f=0;
int jue(int aa,int bb)
{
    return aa-bb>0?(aa-bb):(bb-aa);
}
void dfs(int x,int y,int s)
{
    if(a[x][y]=='D')
        {
            if(s==t)
            f=1;
        }
    else if(s<t&&!f&&a[x][y]=='.')
    {
       char c=a[x][y];
        a[x][y]='X';
        dfs(x+1,y,s+1);
        dfs(x-1,y,s+1);
        dfs(x,y+1,s+1);
        dfs(x,y-1,s+1);
        a[x][y]=c;
    }
}
int main()
{
    while(scanf("%d%d%d",&xx,&yy,&t)!=EOF)
    {
        if(!xx&&!yy&&!t)
            break;
        memset(a,0,sizeof(a));
        int i,j,qx,qy,zx,zy;
        for(i=1; i<=xx; i++)
        {
            for(j=1; j<=yy; j++)
            {
                cin>>a[i][j];
                if(a[i][j]=='S')
                    qx=i,qy=j,a[i][j]='.';
                if(a[i][j]=='D')
                    zx=i,zy=j;
            }
        }
        f=0;
        int d=0;
        if(t>=xx*yy)
            d=1;
        if((t-jue(zx,qx)-jue(zy,qy))%2)
                d=1;
        if(!d)
        dfs(qx,qy,0);
        if(f)
            printf("YES\n");
        else
            printf("NO\n");
    }
}

你可能感兴趣的:(深搜,hdu日常小练)