HDU 1010 Tempter of the Bone

 

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 ;

} 

 

你可能感兴趣的:(HDU)