hdu 1010(dfs)

做的非常恶心的一题,一个脑残错找了N久,剪枝后还是那么慢...

#include<iostream>
#include<cstdio>
using namespace std ;
char str[10][10] ;
int tur[4][2] = {{-10}, {10}, {0, -1}, {01}} ;
int e, n, m, t, di, dj ;
int abs(int a){
    return a<0?-a:a ;
}
void dfs(int i, int j, int ct){
    if(i==di&&j==dj&&ct==t)
        e = 1 ;
    if(e)    return ;
    if(i<1||i>n||j<1||j>m)  return ;
    int dis = t-ct - abs(i-di) - abs(j-dj) ;
    if(dis<0||dis&1)    return ;
    for(int k=0; k<4; k++){
        int x = i+tur[k][0] ;
        int y = j+tur[k][1] ;
        if(str[x][y]!='X'){
            str[x][y]='X' ;
            dfs(x, y, ct+1) ;
            str[x][y]='.' ;
        }
    }
    return ;
}
int main(){
    while(~scanf("%d%d%d", &n, &m, &t)&&(n+m+t)){
        int wall = 0, si, sj ;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                cin >> str[i][j] ;
                if(str[i][j]=='S')
                    si = i, sj = j ;
                if(str[i][j]=='D')
                    di = i, dj = j ;
                if(str[i][j]=='X')
                    wall ++ ;
            }
        }
        if(n*m-wall<t){//能走的位置小于时间
            printf("NO\n") ;
            continue ;
        }
        e = 0 ;
        str[si][sj] = 'X' ;
        dfs(si, sj, 0) ;
        if(e)
            printf("YES\n") ;
        else
            printf("NO\n") ;
    }
    return 0 ;

} 

原文地址:https://www.cnblogs.com/xiaolongchase/p/2264563.html