2018-07-14-奇偶剪枝

题目:Problem - 1010

刚开始超时,网上查了一下,了解到了奇偶剪枝。改了一下,WA了一天,最后,看到:

HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU - MiYu - 博客园

感谢提醒。原来用的是gets,scanf("%s"),getchar,scanf("%c"),都没有通过,

最后用scanf(" %c ")和cin通过了。

不过,我还有一点想不明白的是,效率应该如何计算呢?超时的时候记录了一下递归的次数,高得惊人,而我却无法从理论上推导出来这个值。

源代码:

#include
#include
#include

#define YES 1
#define NO 0

int n,m,t;
char *p=NULL;
//long long cnt=0;
int A[]={-1,1,0,0},B[]={0,0,-1,1};

int search(int n1,int n2,int depth)
{
//    cnt++;
    if( n1<0 || n1>=n || n2<0 || n2>=m)
    {
        return NO;
    }
    if(p[n1*m+n2]=='X')
    {
        return NO;
    }
    if(p[n1*m+n2]=='D')
    {
        if(depth==t)
        {
            return YES;
        }
        else
        {
            return NO;
        }
    }
    if(depth>t)
    {
        return NO;
    }
    depth++;
    p[n1*m+n2]='X';
    int i;
    for(i=0; i<4 && search(n1+A[i],n2+B[i],depth)!=YES ;i++);
    p[n1*m+n2]='.';
    if(i>=4)
        return NO;
    else
        return YES;
}

int main()
{
    while(1)
    {
        int i,j,si,sj,ei,ej;
        scanf("%d%d%d",&n,&m,&t);
        if(n==0 && m==0 && t==0)
            break;
        p=(char*)calloc(n*m,sizeof(char));
        assert(p);
        getchar();
        for(i=0;i> p[i*m+j] ;
                scanf(" %c ",p+i*m+j);
                switch(p[i*m+j])
                {
                    case 'S':
                        si=i;
                        sj=j;
                        break;
                    case 'D':
                        ei=i;
                        ej=j;
                        break;
                }
            }
        }
        i=si-ei+sj-ej;
        i=i<0?-i:i;
        if( t

你可能感兴趣的:(2018-07-14-奇偶剪枝)