标签:
需要在确切的时间到达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;
}
标签:
原文地址:http://www.cnblogs.com/luxiaoming/p/4705266.html