HDU1010 Tempter of the Bone dfs(奇偶减枝)

直接搜索会超时,需要减枝(奇偶减枝)。

#include<stdio.h>
#include<string.h>
int n,m,t;
char map[7][7];
int x0,y0,x1,y1;  
int flag;    
int abs(int a) 
{
    a>0?:a=-a; 
    return a;
}
void dfs(int time,int x,int y)
{
    int temp=time-(abs(x1-x)+abs(y1-y));
    if(temp<0||temp%2) return;//剩余时间-距离终点的最小步数 小于0(够不到终点)或者 为奇数(最多能到终点前一个位置)则返回 
    else if(time==0) 
    {
        if(x==x1&&y==y1)
            flag=1;
        else return;    
    }
    if(flag) return;
    if(x-1>=0&&map[x-1][y]!='X')
    {
        map[x-1][y]='X';  
        dfs(time-1,x-1,y);
        map[x-1][y]='.';                     
    }
    if(y-1>=0&&map[x][y-1]!='X')
    {
        map[x][y-1]='X';
        dfs(time-1,x,y-1);
        map[x][y-1]='.';    
    }
    if(x+1<n&&map[x+1][y]!='X')
    {
        map[x+1][y]='X';
        dfs(time-1,x+1,y);
        map[x+1][y]='.';                       
    }
    if(y+1<m&&map[x][y+1]!='X')
    {
        map[x][y+1]='X';
        dfs(time-1,x,y+1);
        map[x][y+1]='.';                       
    }
    return;
}
int main(void)
{
    int count;
    while(scanf("%d%d%d",&n,&m,&t))   
    {
        if(n==0&&m==0&&t==0) break;
        flag=0;
        count=0;
        getchar();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                scanf("%c",&map[i][j]); 
                if(map[i][j]=='S')
                {
                    x0=i;
                    y0=j; 
                    map[i][j]='X';                 
                }   
                if(map[i][j]=='D')
                {
                    x1=i;
                    y1=j; 
                    count++;                 
                }    
                if(map[i][j]=='.') count++;
            }
            getchar();
        }
        if(t>count||t<abs(x1-x0)+abs(y1-y0))
        {
            printf("NO
");
            continue;                            
        }
        dfs(t,x0,y0);
        if(flag) printf("YES
");
        else printf("NO
");  
    } 
}
原文地址:https://www.cnblogs.com/lqquan/p/3671870.html