//几个剪枝的方法如果不明白再问我
#include <iostream>
using namespace std;
int row,column,time;
int op[4][2] = {-1,0,1,0,0,-1,0,1};
char grap[10][10];
int start_x,start_y,end_x,end_y; //起点,终点
int count;
int sign;
//当前点的X,Y坐标,t为起点到当前点的时间
void dfs(int x,int y,int t)
{
int X,Y;
int i;
if(sign) //如果已经找到解了,都要返回
{
return ;
}
if(end_x == x && end_y == y && t == time) //找到目标
{
sign = 1;
return ;
}
if( (time - t) % 2 != (x+y+end_x+end_y) % 2 ) //奇偶减枝法
{
return ;
}
if(abs(x-end_x) + abs(y-end_y) > time - t) //当前点到终点的最短时间若比剩余的时间还长的话
{
return;
}
for(i=0;i<4;i++)
{
X = x + op[i][0];
Y = y + op[i][1];
if(X <= 0 || X > row || Y <= 0 || Y > column) //判断是否越界
{
continue;
}
if(grap[X][Y] != 'X')
{
grap[X][Y] = 'X'; //将走过的.变为X
dfs(X,Y,t+1); //往下搜索,t+1
grap[X][Y] = '.'; //回溯恢复X为.
}
}
}
int main()
{
int i,j;
while(cin>>row>>column>>time,row+column+time)
{
count = 0;
sign = 0;
for(i=1;i<=row;i++)
{
for(j=1;j<=column;j++)
{
cin>>grap[i][j];
//找到起点
if(grap[i][j] == 'S')
{
start_x = i;
start_y = j;
grap[i][j] = 'X'; //将起点标记为'X',不能重复走
}
//找到终点
if(grap[i][j] == 'D')
{
end_x = i;
end_y = j;
}
if(grap[i][j] == '.')
{
count++;
}
}
}
//总共可以走的步数如果比给定时间还少
if(count + 1 < time)
{
cout<<"NO"<<endl;
continue;
}
//从起点开始搜索
dfs(start_x,start_y,0);
if(sign)
{
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}