DFS
#include <iostream>
#include <cmath>
using namespace std;
int n,m,t,bi,bj,ei,ej,z,zz;
char a[10][10];
int k[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void f(int x,int y,int r)
{
int i,xx,yy,t1;
if(x<=0||x>n||y<=0||y>m)
return;
if(z==1)
return;
if(x==ei&&y==ej&&r==t)//条件成立
{
z=1;
return;
}
t1=(t-r)-abs(x-ei)-abs(y-ej);//奇偶剪枝(不是很懂)
if(t1<0||t1 & 1)
return;
for(i=0;i<4;i++)
{
xx=x+k[i][0];
yy=y+k[i][1];
if(a[xx][yy]!='X')
{
a[xx][yy]='X';//先设为墙
f(xx,yy,r+1);//递归,继续搜索
a[xx][yy]='.';//还原回可走
}
}
return;
}
int main()
{
int i,j;
while(cin>>n>>m>>t)
{
if(n==0&&m==0&&t==0)
break;
zz=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='S')//记录起点坐标
{
bi=i;
bj=j;
}
if(a[i][j]=='D')//记录终点坐标
{
ei=i;
ej=j;
}
if(a[i][j]=='X')//记录墙的数目
zz++;
}
}
z=0;
a[bi][bj]='X';
if(n*m-zz<=t)//如果可以走的步数少于等于t,则失败(起点不算一步所以是<span style="font-family: Arial, Helvetica, sans-serif;"><=t)</span>
{
cout<<"NO"<<endl;
continue;
}
f(bi,bj,0);
if(z==0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}