http://acm.hdu.edu.cn/showproblem.php?pid=1010

奇偶剪枝,说好的里程碑来了。。。

跳出dfs的时候一定要注意确保跳出。。。我开始写的时候没有跳出dfs只是跳出了一层递归,导致长时间tle,orz涂涂能看出这种问题。

View Code
#include <iostream>
#include <queue>
using namespace std ;
int n,m,t ;
int flag ;
int e ;
char map[10][10] ;
void dfs(int x,int y,int time)
{
    int tab[][2]={1,0,-1,0,0,1,0,-1} ;
    if(flag)
        return ;
    if(time==t && map[x][y]=='D')
    {
        flag=1 ;
        return ;
    }
    int temp=abs(x-y)&1 ;
    if(temp==e && (t-time)&1)
        return ;
    if(temp!=e && (t-time)&1==0)
        return ;
    map[x][y]='X' ;
    int xx,yy ;
    for(int i=0;i<4;i++)
    {
        xx=x+tab[i][0] ;
        yy=y+tab[i][1] ;
        if(xx<0 || xx>=n)continue ;
        if(yy<0 || yy>=m)continue ;
        if(map[xx][yy]=='X')continue ;
        if(map[xx][yy]=='D' && time+1!=t)continue ;
        dfs(xx,yy,time+1) ;
        map[xx][yy]='.' ;
    }
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&t),(n||m||t))
    {
        for(int i=0;i<n;i++)
            scanf("%s",map[i]) ;
        int xx,yy ;
        int cnt=0 ;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(map[i][j]=='S')
                    xx=i,yy=j ;
                if(map[i][j]=='D')
                    e=abs(i-j)&1 ;
                if(map[i][j]=='X')
                    cnt++ ;
            }
        if(n*m-cnt<t)
        {
            puts("NO") ;
            continue ;
        }
        flag=0 ;
        dfs(xx,yy,0) ; 
        if(flag)
            puts("YES") ;
        else 
            puts("NO") ;
    }
    return 0 ;
}