#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int n,m,t,flag;
int starx,stary,doorx,doory,wallnumber;
int movex[]={0,-1,0,1},movey[]={-1,0,1,0};
char maze[7][7];
void dfs(int,int,int); //深搜
int main()
{
int i,j;
while(scanf("%d %d %d",&n,&m,&t)!=EOF && !(n==0 && m==0 && t==0))
{
getchar(); //吸收回车
wallnumber=0;
flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S') //记录小狗的起始位置
{
starx=i;
stary=j;
maze[starx][stary]='X'; //注意起点位置的标记,容易遗漏
}
else if(maze[i][j]=='D') //记录门的位置
{
doorx=i;
doory=j;
}
else if(maze[i][j]=='X')
wallnumber++; //记录墙的数量
}
getchar(); //吸收回车
}
if(n*m-wallnumber>=t) //当可以走的街区数大于时间才进入搜索
{
dfs(starx,stary,0);
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
void dfs(int sx,int sy,int startime)
{
int i,time;
if(sx==doorx && sy==doory && startime==t)
{flag=1;return;}
time=t-startime-abs(sx-doorx)-abs(sy-doory); //time为剩余时间
if(time<0 || time%2!=0) //剪掉奇数枝
return;
for(i=0;i<4;i++) //上下左右四个方向
{
if(sx+movex[i]<0||sx+movex[i]>n-1||sy+movey[i]<0||sy+movey[i]>m-1) //注意边界问题:是>n-1,m-1
continue;
if(maze[sx+movex[i]][sy+movey[i]]!='X')
{
maze[sx+movex[i]][sy+movey[i]]='X';
dfs(sx+movex[i],sy+movey[i],startime+1); //注意此时startime+1和startime++的区别
maze[sx+movex[i]][sy+movey[i]]='.'; //遍历后还原
}
if(flag) break;
}
}
#include<math.h>
#include<stdlib.h>
int n,m,t,flag;
int starx,stary,doorx,doory,wallnumber;
int movex[]={0,-1,0,1},movey[]={-1,0,1,0};
char maze[7][7];
void dfs(int,int,int); //深搜
int main()
{
int i,j;
while(scanf("%d %d %d",&n,&m,&t)!=EOF && !(n==0 && m==0 && t==0))
{
getchar(); //吸收回车
wallnumber=0;
flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S') //记录小狗的起始位置
{
starx=i;
stary=j;
maze[starx][stary]='X'; //注意起点位置的标记,容易遗漏
}
else if(maze[i][j]=='D') //记录门的位置
{
doorx=i;
doory=j;
}
else if(maze[i][j]=='X')
wallnumber++; //记录墙的数量
}
getchar(); //吸收回车
}
if(n*m-wallnumber>=t) //当可以走的街区数大于时间才进入搜索
{
dfs(starx,stary,0);
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
void dfs(int sx,int sy,int startime)
{
int i,time;
if(sx==doorx && sy==doory && startime==t)
{flag=1;return;}
time=t-startime-abs(sx-doorx)-abs(sy-doory); //time为剩余时间
if(time<0 || time%2!=0) //剪掉奇数枝
return;
for(i=0;i<4;i++) //上下左右四个方向
{
if(sx+movex[i]<0||sx+movex[i]>n-1||sy+movey[i]<0||sy+movey[i]>m-1) //注意边界问题:是>n-1,m-1
continue;
if(maze[sx+movex[i]][sy+movey[i]]!='X')
{
maze[sx+movex[i]][sy+movey[i]]='X';
dfs(sx+movex[i],sy+movey[i],startime+1); //注意此时startime+1和startime++的区别
maze[sx+movex[i]][sy+movey[i]]='.'; //遍历后还原
}
if(flag) break;
}
}