因为要求不是最快到达,而是在T时刻正好到达,所以不能用BFS搜。DFS注意剪枝,如果剩余时间和剩余步数奇偶性不同的话要减掉。
//Memory: 232 KB
//Time: 687 MS
#include <stdio.h>
#include <string.h>
#include <math.h>
char map[10][10];
bool vis[10][10];
int dx,dy,n,m,time;
int d[4][2]={1,0,0,1,-1,0,0,-1};
bool flag;
void dfs(int x,int y,int t)
{
if((x+y+dx+dy)%2 != t%2)
return;
if(t==0)
return;
if(flag)
return;
vis[x][y]=true;
int k=0,xt,yt;
for(k=0;k<4;k++)
{
xt=x+d[k][0];
yt=y+d[k][1];
if(xt>=1 && xt<=n && yt>=1 && yt<=m )
if(map[xt][yt]!='X' && !vis[xt][yt])
{
if(dx==xt && dy==yt && t==1)
flag=true;
else
{
dfs(xt,yt,t-1);
}
if(flag)
return;
}
}
vis[x][y]=false;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&time)!=EOF)
{
if(n==0 && m==0 && time==0)
break;
flag=false;
memset(vis,false,sizeof(vis));
int i,j;
int st,sy;
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')
{st=i;sy=j;}
if(map[i][j]=='D')
{dx=i;dy=j;}
}
getchar();
}
dfs(st,sy,time);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}