#include <stdio.h>
#include <math.h>
int dir[][2] = {1,0,-1,0,0,1,0,-1};
bool vis[10][10];
char maze[10][10];
int n,m,t_time,end_x,end_y;
int myabs(int x)
{
return x>=0?x:-x;
}
bool DFS(int pos_x,int pos_y,int t)
{
int absx = abs(end_x-pos_x);
int absy = abs(end_y-pos_y);
if(maze[pos_x][pos_y]=='D'&&t==t_time)
{
return true;
}
//所用的时间超过所需最大时间
if(t>=t_time)
{
return false;
}
//设下的时间比理论最少到达时间要少那么必定到不了
if(t_time-t<(absx+absy))
{
return false;
}
//剩余时间比理论最少时间多出的不是偶数必然到不了
if((t_time-t-absx-absy)%2!=0)
{
return false;
}
int i,next_x,next_y;
for(i=0;i<4;i++)
{
next_x = pos_x+dir[i][0];
next_y = pos_y+dir[i][1];
if(next_x>=0&&next_x<n&&next_y>=0&&next_y<m&&!vis[next_x][next_y]&&maze[next_x][next_y]!='X')
{
vis[next_x][next_y] = true;
if(!DFS(next_x,next_y,t+1))
{
vis[next_x][next_y] = false;
}
else
{
return true;
}
}
}
return false;
}
int main()
{
int i,j,star_x,star_y;
bool flag;
while(scanf("%d %d %d",&n,&m,&t_time)==3)
{
if(n==0&&m==0&&t_time==0)
break;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
vis[i][j] = false;
for(i=0;i<n;i++)
{
scanf("%s",maze[i]);
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if(maze[i][j]=='S')
{
star_x = i;
star_y = j;
}
if(maze[i][j]=='X')
{
end_x = i;
end_y = j;
}
}
}
vis[star_x][star_y] = true;
flag = DFS(star_x,star_y,0);
//flag = BFS(star_x,star_y,0);
if(!flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}