单纯用dfs会超时
要用剪枝优化
提供一组变态数据
6 6 37
S.....
......
......
......
......
D.....
NO
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
struct node{
int x,y;
};
int N,M,T;
char mp[8][8];
node Begin,End;
int dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} };
bool Tap=false;
bool OutBorder(int x,int y){
if(x<0||x>=N||y<0||y>=M)
return true;
return false;
}
int OddOrEven(int x,int y){
return abs(x-End.x)+abs(y-End.y);
}
void dfs(int x,int y,int t){
if(Tap)
return ;
//printf("X: %d Y:%d t: %d\n",x,y,t);
int temp=OddOrEven(x,y);
temp=T-t-temp;
if( temp<0 ||temp&1 || t>T)
return ;
if(t==T&&x==End.x&&y==End.y){
Tap=true;
return ;
}
for(int i=0;i<4;i++){
int cur_x=x+dir[i][0];
int cur_y=y+dir[i][1];
if(!OutBorder(cur_x,cur_y)&&(mp[cur_x][cur_y]!='X')){
mp[cur_x][cur_y]='X';
dfs(cur_x,cur_y,t+1);
mp[cur_x][cur_y]='.';
if(Tap)
return ;
}
}
}
//6 6 37
//S.....
//......
//......
//......
//......
//D.....
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
while(cin>>N>>M>>T,N&&M&&T){
Tap=false;
int cnt=0;
for(int i=0;i<N;i++){
cin>>mp[i];
for(int j=0;j<M;j++){
if(mp[i][j]=='D') End.x=i,End.y=j;
else if(mp[i][j]=='S') Begin.x=i,Begin.y=j;
else if(mp[i][j]=='X') cnt++;
}
}
if(N*M-cnt<=T)
Tap=false;
else{
mp[Begin.x][Begin.y]='X';
dfs(Begin.x,Begin.y,0);
}printf("%s\n",Tap==true?"YES":"NO");
}
}