#include <stdio.h>
#include <math.h>
int m,n,t,flag; //行列,是否到终点的标记
int sx,sy,ex,ey;
int xmove[5]={0,0,1,0,-1},ymove[5]={0,1,0,-1,0}; //记录四个方向
char a[10][10];
void dfs(int x,int y,int tt)
{
int i;
if(t==tt && x==ex && y==ey) //到终点
{
flag=1;
return ;
}
if(tt>t) //时间剪枝
return ;
if(abs(x-ex)+abs(y-ey)>(t-tt)) //路程剪枝
return ;
for(i=1;i<=4;i++)
{
int tx=x+xmove[i];
int ty=y+ymove[i];
if(tx>m || tx<1 || ty>n || ty<1 || a[tx][ty]=='X')//判断当前点是否超范围或是否撞墙
continue ;
a[x][y]='X'; //符合则上一个点标记为墙,表示已走过
dfs(tx,ty,tt+1);
if(flag)
return ;
else
a[x][y]='.';
}
}
int main()
{
while(scanf("%d %d %d",&m,&n,&t)!=EOF)
{
if(m==0 && n==0 && t==0)
return 0;
int k=0;
flag=0;
int i,j;
for(i=1;i<=m;i++)
{
scanf("%s",&a[i][1]);
for(j=1;j<=n;j++)
{
if(a[i][j]=='S')
{
sx=i;
sy=j;
}
if(a[i][j]=='D')
{
ex=i;
ey=j;
}
if(a[i][j]=='.')
k++;
}
}
if((abs(sx-ex)+abs(sy-ey)+t)%2==1 || k+1<t)//神奇的奇偶剪枝,这是一个很关键的地方
{
printf("NO\n");
continue;
}
dfs(sx,sy,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}