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\n"); else printf("NO\n"); } return 0; }