#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#define N 20
using namespace std;
int n,m,t,sx,sy,ex,ey;;
int a[N][N];
int vis[N][N];
int path[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
char ch[10];
int flag;
int check(int x, int y)
{
if(x < 0 || x >= n || y < 0 || y >= m) return 0;
if(vis[x][y] || a[x][y] == 1) return 0;
return 1;
}
/** 深搜 */
void dfs(int x, int y, int cnt)
{
if(flag) return;
if(x == ex && y == ey && cnt == t)
{
flag = 1;
return;
}
/** 剪枝, 因为题目要求doggie必须在第t秒到达门的位置,所以(t-cnt)和abs(ex-x)+abs(ey-y)的
奇偶性必然相同。因此(t-cnt)+ abs(ex-x)+abs(ey-y)必然为偶数。*/
int min_dis=abs(x-ex)+abs(y-ey); /**当前点到终点的最短距离*/
if(min_dis > t-cnt || (min_dis + t-cnt )%2 != 0)
return;
for(int i = 0;i < 4;i++)
{
int nx = x + path[i][0];
int ny = y + path[i][1];
if(check(nx, ny))
{
vis[nx][ny] = 1;
dfs(nx, ny, cnt+1);
vis[nx][ny] = 0;
}
}
}
int main()
{
while(~scanf("%d%d%d", &n,&m,&t))
{
if(n == 0 && m == 0 && t == 0)
break;
memset(vis, 0, sizeof(vis));
int num = 0;
for(int i = 0;i < n;i++)
{
scanf("%s", ch);
for(int j = 0;j < m;j++)
{
if(ch[j] == 'S')
{
a[i][j] = 0;
sx = i;sy = j;
}
if(ch[j] == 'D')
{
a[i][j] = 0;
ex = i;ey = j;
}
if(ch[j] == 'X')
{
a[i][j] = 1;
num++; /** 记录墙的数量*/
}
if(ch[j] == '.')
a[i][j] = 0;
}
}
/** 特殊情况,特判,当走完所有的点时,还没有到t秒,则说明不能走出去 */
if(n*m-num-1<t)
{
printf("NO\n");
continue;
}
flag = 0;
vis[sx][sy] = 1;
dfs(sx,sy, 0);
if(flag)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
#include <stdio.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#define N 20
using namespace std;
int n,m,t,sx,sy,ex,ey;;
int a[N][N];
int vis[N][N];
int path[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
char ch[10];
int flag;
int check(int x, int y)
{
if(x < 0 || x >= n || y < 0 || y >= m) return 0;
if(vis[x][y] || a[x][y] == 1) return 0;
return 1;
}
/** 深搜 */
void dfs(int x, int y, int cnt)
{
if(flag) return;
if(x == ex && y == ey && cnt == t)
{
flag = 1;
return;
}
/** 剪枝, 因为题目要求doggie必须在第t秒到达门的位置,所以(t-cnt)和abs(ex-x)+abs(ey-y)的
奇偶性必然相同。因此(t-cnt)+ abs(ex-x)+abs(ey-y)必然为偶数。*/
int min_dis=abs(x-ex)+abs(y-ey); /**当前点到终点的最短距离*/
if(min_dis > t-cnt || (min_dis + t-cnt )%2 != 0)
return;
for(int i = 0;i < 4;i++)
{
int nx = x + path[i][0];
int ny = y + path[i][1];
if(check(nx, ny))
{
vis[nx][ny] = 1;
dfs(nx, ny, cnt+1);
vis[nx][ny] = 0;
}
}
}
int main()
{
while(~scanf("%d%d%d", &n,&m,&t))
{
if(n == 0 && m == 0 && t == 0)
break;
memset(vis, 0, sizeof(vis));
int num = 0;
for(int i = 0;i < n;i++)
{
scanf("%s", ch);
for(int j = 0;j < m;j++)
{
if(ch[j] == 'S')
{
a[i][j] = 0;
sx = i;sy = j;
}
if(ch[j] == 'D')
{
a[i][j] = 0;
ex = i;ey = j;
}
if(ch[j] == 'X')
{
a[i][j] = 1;
num++; /** 记录墙的数量*/
}
if(ch[j] == '.')
a[i][j] = 0;
}
}
/** 特殊情况,特判,当走完所有的点时,还没有到t秒,则说明不能走出去 */
if(n*m-num-1<t)
{
printf("NO\n");
continue;
}
flag = 0;
vis[sx][sy] = 1;
dfs(sx,sy, 0);
if(flag)
printf("YES\n");
else printf("NO\n");
}
return 0;
}