/*这个题是个好题啊。。DFS。。加奇偶剪枝。。
DFS就不说了。。说一下奇偶剪枝,,
可以把map看成这样:
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
从为 0 的格子走一步,必然走向为 1 的格子
从为 1 的格子走一步,必然走向为 0 的格子
即:
0 ->1或1->0 必然是奇数步
0->0 走1->1 必然是偶数步
所以当遇到从 0 走向 0 但是要求时间是奇数的,
或者, 从 1 走向 0 但是要求时间是偶数的
都可以直接判断不可达!
就是如果,走到某个格子的时候,判断这个格子到终点的步数和时间有没有同奇同偶,没有的话就不可能在要求的时间点到达终点。
。就可以直接剪掉、、
剪枝是一个很重要的思想。。很多的时候都要用到这个思想。。不然都会TLE。。*/
#include <stdio.h>
#include <iostream>
#include <math.h>
#include<stdlib.h>//abs()有的时候要加这个头文件
using namespace std;
#define size 10
bool status;
int DogX,DogY,DoorX,DoorY;
int M,N,T;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
char maze[size][size];
void DFS(int x,int y,int t)
{
int dx,dy;
int i;
if(t==T&&x==DoorX&&y==DoorY)
status=true;
if(status)
return ;
if((abs(DoorX-x)+abs(DoorY-y))%2!=(T-t)%2) //奇偶剪枝。。现在的步数要跟给定的时间同奇同偶;
return ;
for(i=0;i<4;i++)
{
dx=x+dir[i][0];
dy=y+dir[i][1];
if(dx>=0&&dx<M&&dy>=0&&dy<N&&maze[dx][dy]!='X')
{
maze[dx][dy] = 'X';
DFS(dx,dy,t+1);
maze[dx][dy] = '.'; //回溯
}
}
}
int main()
{
int i,j;
int num;
while(scanf("%d%d%d",&M,&N,&T)!=EOF)
{
if(M==0&&N==0&&T==0)
break;
num=0;
status=false;
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
cin>>maze[i][j];
if (maze[i][j]=='S')
{
DogX = i;
DogY = j;
}
else if(maze[i][j]=='D')
{
DoorX=i;DoorY=j;
num++;
}
else
num++;
}
getchar();
}
maze[DogX][DogY]='X';
if(num>=T) //可以走的地方如果比时间少的话那就一定不行了。
DFS(DogX,DogY,0);
if(status)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}