/*
1010标准搜索题,不过一开始很容易把题目看错
易错的理解:广搜,在t秒之内从起点走到终点即可。纯模版题
正确的理解:深搜,每个点在只能去一次的情况下,而且不能停留只能经过
这就要求我们把所有的路径遍历
方法:深搜+数学奇偶性剪枝
效率:578ms
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
using namespace std;
#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","r",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca(x) scanf("%d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define MAXN 0x7fffffff
int dir_x[]={0,1,-1,0,0};//x方向常量
int dir_y[]={0,0,0,1,-1};//y方向常量
int map[10][10];//存储地图,将题中的字母全部改为习惯的0断1通
bool book[10][10];//深搜模版中标记每个点是否走过
int n,m,t,i,j,k;
int sx,sy,ex,ey;//sx==startx,sy==starty,ex==endx,ey==endy
char in[10];
int flag;//标记是否有解
void dfs(int cur_x,int cur_y,int steps)//传入的是当前在哪个坐标(x,y),已经从起点走了多少步
{
if (steps>t) return;//不可能有解则返回
if (cur_x==ex&&cur_y==ey&&steps==t)//满足条件为有解
{
flag=1;return;
}
int i,j,k,newx,newy;
for(k=1;k<=4;k++)//四种方向
{
newx=cur_x+dir_x[k];
newy=cur_y+dir_y[k];
if (newx>0&&newx<=n&&newy>0&&newy<=m&&!book[newx][newy]&&!map[newx][newy])
//坐标在矩形内,坐标没有访问过,坐标可以访问(此点不为墙)
{
book[newx][newy]=1;//标记已走过
dfs(newx,newy,steps+1);
if (flag) return;//如果有解即使返回,不需要继续搜索
book[newx][newy]=0;//取消标记
}
}
return;
}
int main()
{
//input;
while(cin>>n>>m>>t)
{
Fill(map,0);
Fill(book,0);
if (!n&&!m&&!t) break;
For2(i,1,n)
{
cin>>in;
For2(j,1,m)
if (in[j-1]=='S')
map[i][j]=0,sx=i,sy=j;
else if (in[j-1]=='D')
map[i][j]=0,ex=i,ey=j;
else if (in[j-1]=='X')
map[i][j]=1;
}//如何处理字符
if (sx==ex&&sy==ey)//剪枝一,如果终点和起点在一起(其实不可能)
{
cout<<"YES"<<endl;
continue;
}
if ((abs(sx-ex)+abs(sy-ey)>t)||((t-abs(sx-ex)-abs(sy-ey))%2==1))
//剪枝2,若起点与终点的坐标轴距离大于t,或者之差为奇数则不可能走得到
{
cout<<"NO"<<endl;
continue;
}
book[sx][sy]=1;
flag=0;
dfs(sx,sy,0);
if (flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}