/*DFS
思想:利用深度优先搜索,将每一个点的状态抽象出来,一个三元组(x,y,t);
x,y代表坐标,t表示从起点到这一坐标的时间,那么这就是一个状态,深度
搜索的任务就是对状态的扩展,观察并判断是否到达目标状态;见如下代码,
注释地方都有,同时支持多组测试数据;*/
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 10
int n,m,t;
bool en;
int v[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char ac[maxn][maxn];
void dfs(int a,int b,int cnt){
for(int i=0;i<4;i++){
int fx=a+v[i][0];
int fy=b+v[i][1];
if(fx<0 || fy<0 || fx>=n || fy>=m) continue;
if(ac[fx][fy]=='X') continue;
if(ac[fx][fy]=='D') {
if(cnt+1==t){
en=true;
return;
}else{
continue;//继续,并且该状态的后继状态不可能为答案,
}
}
ac[fx][fy]='X';
dfs(fx,fy,cnt+1);
ac[fx][fy]='.'; //返回后要将其修改回原来的状态
if(en) return;//说明找到了目标状态且满足题意,可以返回;
}
}
int main(){
while(scanf("%d%d%d",&n,&m,&t)&&n!=0&&m!=0&&t!=0){
for(int i=0;i<n;i++){
scanf("%s",ac[i]);
}
en=false;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(ac[i][j]=='S'){
ac[i][j]='X';
dfs(i,j,0);
}
}
}
if(en==true){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}