HDU 1010:(DFS)

需要在确切的时间到达D处

此题特殊的地方在于剪枝方法:根据所处点与D处的曼哈顿距离和所剩步数的奇偶性剪枝。如果两者奇偶性不同,直接return

#include"cstdio"
#include"cmath"
#include"cstring"
#include"iostream"
#include"queue"
#define MAXN 10
using namespace std;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int x,y,time,sx,sy,ex,ey,ok;
int mat[MAXN][MAXN],vis[MAXN][MAXN];
char arr[MAXN];
void dfs(int i,int j,int step)
{   if(ok) return;
    if(fabs(i-ex)+fabs(j-ey)>step||(step-(int)(fabs(i-ex)+fabs(j-ey)))%2) return ;
    if(i==ex&&j==ey&&!step) {ok=1;return;}
    if(!step) return;
    for(int k=0;k<=4;k++){
        if(i+dx[k]>=0&&i+dx[k]<x&&j+dy[k]>=0&&j+dy[k]<y&&mat[i+dx[k]][j+dy[k]]&&!vis[i+dx[k]][j+dy[k]]){
            vis[i+dx[k]][j+dy[k]]=1;
            dfs(i+dx[k],j+dy[k],step-1);
            vis[i+dx[k]][j+dy[k]]=0;
        }
    }
    return;
}
int main()
{   while(scanf("%d%d%d",&x,&y,&time)&&(x||y||time)){
    memset(mat,0,sizeof(mat));
        for(int i=0;i<x;i++){
            scanf("%s",arr);
            for(int j=0;j<y;j++){
                if(arr[j]=='S') {sx=i;sy=j;mat[i][j]=0;}
                else if(arr[j]=='.') mat[i][j]=1;
                else if(arr[j]=='X') mat[i][j]=0;
                else {ex=i;ey=j;mat[i][j]=1;}
            }
        }
        memset(vis,0,sizeof(vis));
        ok=0;
        vis[sx][sy]=1;
        dfs(sx,sy,time);
        if(ok) printf("YES
");
        else printf("NO
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luxiaoming/p/4705266.html