一开始以为是bfs!!!
#include<iostream>
#include<math.h>
using namespace std;
char map[10][10];
int n,m,t;
int si,sj,ei,ej;//开始和结束的坐标
int wal,flag;
int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int x,int y,int ut){//ut表示已经用的可用时间!
if(x>n||y>m||x<=0||y<=0) return;
if(ut==t&&x==ei&&y==ej) flag=1;
if(flag==1)return;
int temp=t-ut-abs(x-ei)-abs(y-ej);//x,y点到终点的最短时间是 abs(x-ei)+abs(x-ej); 剪枝!!!
if(temp<0||temp&1) return;//if((abs(ei-x)+abs(ej-y))%2!=(t-tc)%2)return;
//遇到从 0 走向 0 但是要求时间是奇数(坐标差之和为奇数)的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!
for(int i=0;i<4;i++){
if(map[x+d[i][0]][y+d[i][1]]!='X')
{//原因在于终点为D而不是'.';这也是为什么起点设成‘X’的原因
map[x+d[i][0]][y+d[i][1]]='X';
dfs(x+d[i][0],y+d[i][1],ut+1);
map[x+d[i][0]][y+d[i][1]]='.';//一定要恢复!!!
}
}
return;
}
int main(){
while(1){
wal=0;
cin>>n>>m>>t;
if(n==0&&m==0&&t==0) break;
for(int i=1;i<=n;i++)//当从0开始的时候不知道为什么硬是要超时?????
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{ si=i;sj=j;}
else if(map[i][j]=='D')
{ ei=i;ej=j;}
else if(map[i][j]=='X')
{wal++;}
}
if(t>=m*n-wal)//剪枝
{ cout<<"NO"<<endl; continue;}
map[si][sj]='X';
flag=0;
dfs(si,sj,0);
if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}