/*
这道题坑有点多
1.要刚好T的时候才能出去
2.到达后就回退,不需要搜索其他的了
3.奇偶剪枝(其实不奇偶剪枝也可以过)
*/
AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int m,n,t,flag;
char maze[15][15];
int b[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int i,int j,int time)
{
if(maze[i][j]=='D'&&time==t)
{
flag=1;
return;
}
if(t<time||(maze[i][j]=='D'&&time<t))
{
return;
}
maze[i][j]='X';
for(int k=0;k<4;k++)
{
int xx=i+b[k][0];
int yy=j+b[k][1];
if(maze[xx][yy]!='X'&&xx>=0&&xx<m&&yy>=0&&yy<n)
{
dfs(xx,yy,time+1);
if(flag)
return;
}
}
maze[i][j]='.';
}
int main()
{
int x,y,ex,ey;
while(scanf("%d%d%d",&m,&n,&t)&&(m||n||t))
{
getchar();
memset(maze,'\0',sizeof(maze));
flag=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S')
{
x=i;
y=j;
}
if(maze[i][j]=='D')
{
ex=i;
ey=j;
}
}
getchar();
}
/*if((t-abs(ex-x)+abs(ey-y))%2!=0)//奇偶剪枝
printf("NO\n");
else*/
{
dfs(x,y,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}