#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int flag=0;
int t,n,m,i;
int a,b;
int zhao(char ch[10][10],int x,int y,int z)
{
if(flag==1||z>t)
return 0;
// if(fabs(x-a)+fabs(y-b)+z>t)
// return 0;
if(ch[x][y]=='S'||ch[x][y]=='.')
{
ch[x][y]='X';
if(x<n-1)
zhao(ch,x+1,y,z+1);
if(x>0)
zhao(ch,x-1,y,z+1);
if(y<m-1)
zhao(ch,x,y+1,z+1);
if(y>0)
zhao(ch,x,y-1,z+1);
ch[x][y]='.';
}
else
{
if(ch[x][y]=='D')
{
if(z==t)
flag=1;
}
}
}
int main()
{
while(1)
{ int x,y,j;
scanf("%d%d%d",&n,&m,&t);
flag=0;
if(n==0&&m==0&&t==0)
break;
char ch[10][10];
memset(ch,'\n',sizeof(ch));
for(i=0;i<n;i++)
scanf("%s",&ch[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(ch[i][j]=='S')
{
x=i; y=j;
}
if(ch[i][j]=='D')
{
a=i; b=j;
}
}
// printf("%d %d\n",x,y);
zhao(ch,x,y,0);
if(flag==0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
自我感觉不用判断那么多,用好回溯即可。