普普通通的深度优先搜索,只不过要稍微剪一下枝,即:当前位置到终点的曼哈顿距离(因为只可以上下左右走)与剩余的时间的奇偶性是否相同,不同则不行。
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年08月28日 星期二 10时09分50秒
> Description:HDU1010
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int m,n,t;
int sx,sy,ex,ey;
bool ok;
char maze[8][8];
bool vis[8][8];
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
bool check(int x, int y)
{
return (0<=x&&x<n&&0<=y&&y<m&&maze[x][y]!='X'&&!vis[x][y]);
}
void dfs(int x, int y, int step)
{
if (x==ex&&y==ey&&step==t)
{
ok=true;
return;
}
if ((abs(x-ex)+abs(y-ey))%2 != abs(t-step)%2)//剪枝
return;
for (int i=0; i<4&&!ok; i++)//小剪枝
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if (check(nx,ny))
{
vis[nx][ny]=true;
dfs(nx,ny,step+1);
vis[nx][ny]=false;
}
}
}
int main()
{
while (~scanf("%d%d%d",&n,&m,&t)&&(m||n||t))
{
for (int i=0; i<n; i++)
scanf("%s",maze[i]);
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
if (maze[i][j]=='S')
{
sx=i;
sy=j;
}
if (maze[i][j]=='D')
{
ex=i;
ey=j;
}
}
}
memset(vis,false,sizeof(vis));
ok=false;
vis[sx][sy]=true;
dfs(sx,sy,0);
if (ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}