HDU 1010
/*************************************************************************
> File Name: HDU1010.cpp
> Author:yuan
> Mail:
> Created Time: 2014年11月05日 星期三 22时22分56秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,t,start_x,start_y,door_x,door_y;
char map[10][10];
bool ans;
bool flag[10][10];
int next[4][2]={1,0,0,1,-1,0,0,-1};
bool check(int pos_x,int pos_y)
{
if(flag[pos_x][pos_y]==0&&pos_x>=0&&pos_x<n&&pos_y>=0&&pos_y<m&&(map[pos_x][pos_y]=='.'||map[pos_x][pos_y]=='D'))
return 1;
return 0;
}
void dfs(int cur_x,int cur_y,int count)
{
// int cur_x=point/m;
//int cur_y=point%m;
// printf("cur_x:%d,cur_y:%d\n",cur_x,cur_y);
if(count>t) return;
if(ans==1) return;
if(cur_x==door_x&&cur_y==door_y)
{
if(count==t) ans=1;
// printf("count:%d\n",count);
return;
}
int temp=(t-count)-abs(door_x-cur_x)-abs(door_y-cur_y);
if(temp<0||temp&1) return;
for(int i=0;i<4;i++){
int pos_x=cur_x+next[i][0];
int pos_y=cur_y+next[i][1];
if(check(pos_x,pos_y))
{
flag[pos_x][pos_y]=1;
dfs(pos_x,pos_y,count+1);
flag[pos_x][pos_y]=0;
}
}
}
int main()
{
// printf("zhang\n");
while(~scanf("%d%d%d",&n,&m,&t)){
// scanf("%d%d%d",&n,&m,&t);
if(!n&&!m&&!t) break;
memset(map,0,sizeof(map));
memset(flag,0,sizeof(flag));
ans=0;
for(int i=0;i<n;i++)
{
scanf(" %s",map[i]);
}
// for(int i=0;i<n;i++)
// printf("%s\n",map[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(map[i][j]=='S') start_x=i,start_y=j;
if(map[i][j]=='D') door_x=i,door_y=j;
}
// printf("Start_x:%d,Start_y:%d,door_x:%d,door_y:%d\n",start_x,start_y,door_x,door_y);
flag[start_x][start_y]=1;
// int start_point=start_x*m+start_y;
dfs(start_x,start_y,0);
if(ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}