HDU 1010 && POJ 2110 Tempter of the Bone

转载请注明出处:http://blog.csdn.net/a1dark

分析:这题是图论经典DFS遍历题、也是经典的DFS剪枝优化题、以前做过很多遍了、现在切图论又遇到了、果断切掉、唉、这题不仅要奇偶剪枝、还要考虑距离与时间来剪枝、确实是道好题、

#include<stdio.h>
#include<string.h>
#include<math.h>
char map[9][9];
int dir[4][2]={1,0,0,1,0,-1,-1,0};
int m,n,t;
int ex,ey;
int flag;
void dfs(int x,int y,int cnt){
    int i,temp,tx,ty;
    if(x<1||y<1||x>m||y>n)return;
    if(x==ex&&y==ey&&cnt==t){
        flag=1;return;
    }
    temp=(t-cnt)-fabs((double)(x-ex))-fabs((double)(y-ey));
    if(temp<0||temp%2)return;
    for(i=0;i<4;i++){
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(map[tx][ty]!='X'){
            map[tx][ty]='X';
            dfs(tx,ty,cnt+1);
            if(flag)return;
            map[tx][ty]='.';
        }
    }
    return;
}
int main(){
    int sx,sy;
    while(scanf("%d%d%d",&m,&n,&t)!=EOF){
        if(m==0&&n==0&&t==0)break;
        memset(map,'\0',sizeof(map));
        int wall=0;
        for(int i=1;i<=m;i++){
            scanf("%s",map[i]+1);
            for(int j=1;j<=n;j++){
                if(map[i][j]=='S'){
                    sx=i;sy=j;
                }
                if(map[i][j]=='D'){
                    ex=i;ey=j;
                }
                if(map[i][j]=='X')
                    wall++;
            }
        }
        if(n*n-wall<=t){
            printf("NO\n");continue;
        }
        flag=0;
        map[sx][sy]='X';
        dfs(sx,sy,0);
        if(flag==0)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}


你可能感兴趣的:(ACM,DFS,奇偶剪枝,剪枝优化)