分析:迷宫问题,要求从S恰好走t步到达D,如果从S到D的最短距离大于t或者S到D的距离和t一奇一偶都不可能到达,直接输入NO,否则Dfs搜索所有可能的路如果存在满足条件的就标记flag=1。
# include <stdio.h>
# include <string.h>
# define abs(x) x>0?x:-(x);
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,m,t,f,count,visit[10][10];
char map[10][10];
void DFS(int x0,int y0)
{
int i,a,b;
if(count>t||f==1)
return;
if(count==t&&map[x0][y0]=='D')
{f=1;return;}
for(i=0;i<4;i++)
{
a=x0+dx[i];
b=y0+dy[i];
if(a>=0&&a<n&&b>=0&&b<m&&map[a][b]!='X'&&!visit[a][b])
{
visit[a][b]=1;
count++;
DFS(a,b);
count--;
visit[a][b]=0;
}
}
}
int main()
{
int i,j,x0,y0,x1,y1,d1,d2;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==0&&m==0&&t==0)
break;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(map[i][j]=='S')
x0=i,y0=j;
else if(map[i][j]=='D')
x1=i,y1=j;
d1=abs(x1-x0);
d2=abs(y1-y0);
if((d1+d2>t)||(d1+d2+t)%2==1)
{printf("NO\n");continue;}
memset(visit,0,sizeof(visit));
f=count=0;
visit[x0][y0]=1;
DFS(x0,y0);
if(f==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}