这道目虽然DFS,剪枝了,但还是超时,最后修改了循环里的运算步骤,险过!!T_T
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int disx[4]={1,0,-1,0};
int disy[4]={0,1,0,-1};
int Map[10][10];
int cnt,a,b,Min,n,m,t,flag;
void DFS(int x,int y,int cnt)
{
if(cnt>t||x<0||x>=n||y<0||y>=m) return ;
else if(x==a&&y==b&&cnt==t)
{
flag=1;
return;
}
else
{
for(int i=0;i<4;i++)
{//cout<<"i="<<i<<endl;
int dx=x+disx[i];
int dy=y+disy[i];//cout<<"x="<<x<<" "<<"y="<<y<<endl;
if(dx>=0&&dx<n&&y>=0&&y<m)
{
if(Map[dx][dy]==1)
{
Map[dx][dy]=0;
DFS(dx,dy,cnt+1);
Map[dx][dy]=1;
}
}
}
}
}
int main()
{
int x,y;
while(cin>>n>>m>>t)
{
int ans=0;
if(n==0&&m==0&&t==0)
break;
memset(Map,0,sizeof(Map));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
char e;
cin>>e;
if(e=='S')
x=i,y=j,Map[i][j]=0;
if(e=='D')
a=i,b=j,Map[i][j]=1;
if(e=='.')
Map[i][j]=1;
if(e=='X')
ans++;
}
}
int step=abs(x-a)+abs(y-b);
//剪枝
if(n*m-ans<t||step>t||(step+t)%2!=0)
{//数空格数是否多余t,步数是否大于t,奇偶剪枝
cout<<"NO"<<endl;
continue;
}
Min=INF;
cnt=0;flag=0;
DFS(x,y,cnt);
if(flag==0) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}