这是个典型的剪枝搜索问题。。。
要注意输入字符的时候,一定要使用getchar(),或scanf(" %c",&c[i][j])
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int m,n,t;
int dx,dy; // 记录起始位置
int Dx,Dy; // 记录门的位置
char c[10][10];
int flag;
void DFS(int x,int y,int s)
{
if(s==t&&x==Dx&&y==Dy){flag=1; return ;} //找到出口,结束搜索
if((abs(Dx-x)+abs(Dy-y))%2 != (t-s)%2) return ; //时间和门所在点的奇偶性不同不可能到达,剪枝掉
if(x>0&&c[x-1][y]!='X'&&s<t) {c[x][y]='X';DFS(x-1,y,s+1);c[x][y]='.';} // 向左
if(flag) return ;
if(y>0&&c[x][y-1]!='X'&&s<t) {c[x][y]='X';DFS(x,y-1,s+1);c[x][y]='.';} // 向上
if(flag) return ;
if(x<n-1&&c[x+1][y]!='X'&&s<t){c[x][y]='X';DFS(x+1,y,s+1);c[x][y]='.';} // 向右
if(flag) return ;
if(y<m-1&&c[x][y+1]!='X'&&s<t){c[x][y]='X';DFS(x,y+1,s+1);c[x][y]='.';} // 向下
return ;
}
int main()
{
int i,j,num;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==0&&m==0&&t==0) return 0;
num=0;
getchar();
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%c",&c[i][j]);
if(c[i][j]=='S'){ // 记录起点
dx=i; dy=j;
}
else if(c[i][j]=='D'){ // 记录终点
Dx=i; Dy=j;
num++;
}
else num++;
}
getchar();
}
if(num<t){ //可行点少于规定时间 不可能到达 剪枝掉
printf("NO\n");
continue;
}
flag=0;
c[dx][dy]='X';
DFS(dx,dy,0); // 从起始点开始遍历搜索
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}