#include<bits/stdc++.h>
using namespace std;
const int maxn=10;
char g[maxn][maxn];
int n,m,T,vis[maxn][maxn],sx,sy,ex,ey,f;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int check(int x,int y){
if(x>=0&&x<n&&y>=0&&y<m) return 1;
return 0;
}
void dfs(int x,int y,int t){
int tt=t+abs(ex-x)+abs(ey-y);
//最短时间 也超过了,和外面剪枝类似
if(tt>T) return ;
if(x==ex&&y==ey&&t==T) {
f=1;return;
}
if(f) return;//这句少了会不去,tle
for(int i=0;i<4;i++){
int tx=x+dir[i][0],ty=y+dir[i][1];
if(!vis[tx][ty]&&check(tx,ty)){
vis[tx][ty]=1;
dfs(tx,ty,t+1);
vis[tx][ty]=0;
}
}
return ;
}
int main(){
while(cin>>n>>m>>T){
if(n==0&&m==0&&T==0) break;
int wall=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]=='S'){
sx=i;sy=j;
}
else if(g[i][j]=='D'){
ex=i;ey=j;
}
else if(g[i][j]=='X'){
wall++;
vis[i][j]=1;
}
}
int t=abs(ex-sx)+abs(ey-sy);
if(n*m-wall<T||t>T||(T-t)%2) puts("NO");
//距离别忘了abs 还有奇偶剪枝
else{
f=0;vis[sx][sy]=1;
dfs(sx,sy,0);
if(f) puts("YES");
else puts("NO");
}
}
}
hdu1010
最新推荐文章于 2021-10-21 18:26:48 发布