#include <iostream>
#include <cmath>
#include <string>
#define N 10
using namespace std;
int move[4][2] = {-1,0,0,-1,0,1,1,0};
//{0,-1,-1,0,1,0,0,1} 109ms;
//{-1,0,0,-1,0,1,1,0} 46ms;
//{0,1,1,0,0,-1,-1,0} 62ms;
//{0,1,1,0,-1,0,0,-1} 62ms;
//{-1,0,1,0,0,-1,0,1} 109ms;
int f, di, dj, T, m, n;
char mp[N][N];
void dfs(int si, int sj, int t)
{
int i, temp;
if (si==di && sj==dj && t==T)
{
f = 1;
return ;
}
// if ((T-t)%2!=(si+sj+dj+di)%2) return ; // 1:
temp = T-t-abs(si-di)-abs(sj-dj); // 2;
if (temp<0 || temp%2!=0) return ; // 3:
for (i=0;i<4;i++)
{
int a, b;
a = si + move[i][0];
b = sj + move[i][1];
if (0<=a && a<m && 0<=b && b<n)
if (mp[a][b]!='X')
{
mp[a][b] = 'X';
dfs(a, b, t+1);
if (f) return ;
mp[a][b] = '.';
}
}
return ;
}
int main()
{
int i, j, si, sj, t, num;
while (cin>>m>>n>>T,n||m||T)
{
num = 0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
char p;
cin>>p;
if (p=='S')
{
si = i;
sj = j;
}
else
if (p=='D')
{
di = i;
dj = j;
}
else
if (p=='X') num++;
mp[i][j] = p;
}
if (m*n - num <= T) // 4:
{
printf("NO\n");
continue;
}
f = 0;
mp[si][sj] = 'X';
dfs(si,sj,0);
if (f)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
1:此处由3:“temp%2!=0”,代替。
2:(T-t)为走到此的剩余时间,(abs(si-di)+abs(sj-dj))为理想最短剩下的路程。temp<0说明剩余时间不够走到终点,cut!
3:网格中两点的所有可行路径,它们的长必定同奇偶。所以最终的某条路径必与上述理想最短路径长度奇偶。又最终解的路径长等于剩余时间。及上述两项,必须同奇偶;
若a,b两项同奇偶。则(a-b)为偶数。故temp%2!=0 就割。。。。。
4:迷宫里能踩的地方加起来小于开门时间,不能出去。。。
*/