#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> int flog,u,v,d_x,d_y,n,m,k; int dx[5]={0,1,-1,0}; //初始化 4个方向 int dy[5]={1,0,0,-1}; int map[20][20]; void dfs(int x,int y,int step) { if(step >=k || flog ) return; // 剪枝 如果我找到了,或者我当前的步数已经到了我要走的步数,剪枝 int cur = k - step - abs(x-d_x) - abs(y-d_y); if(cur<0||cur&1) return ; //如果我剩下的步数,走最短的时候也不能到大的话,或者(奇偶剪枝)就是我剩下的步数 一定与我到达 终点 所用的步数奇偶性是相通的 for(int d=0;d<4;d++) { int nx = x + dx[d]; int ny = y + dy[d]; if(d_x == nx&&d_y == ny&& step+1 == k) { flog = 1; return ; } if(map[nx][ny]==1) { map[nx][ny] = 0; dfs(nx,ny,step+1); map[nx][ny] = 1; //要把原数组还原 } } } int main() { while(~scanf("%d%d%d",&n,&m,&k),n) { int sum=0;flog=0; memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { char c = getchar(); switch(c) { case 'X' : sum++ ; break; case 'S' : u=i,v=j; break; case 'D' : d_x=i,d_y=j; break; case '.' : map[i][j]=1; break; } } getchar(); } dfs(u,v,0); if(flog) puts(YES); else puts(NO); } }