题目描述
在一个迷宫里面有一只小狗发现了一根骨头,现在他准备逃出迷宫,迷宫中只有一个地方有门可以出去,而且这个门只会在T秒的时候打开,开了之后下一时刻就会关闭。每移动一步要花费1秒,规定不能停留在某一个位置上,即走到一个位置要立刻前往下一个位置。每个位置不能重复走。假设小狗很聪明,它能成功逃出迷宫么?
输入格式
第一行输入三个整数n,m,Tn,m,T,表示迷宫的尺寸以及门打开的时间接下来nn行每行mm个字符,表示迷宫中每一个位置上的信息。
'X': 表示墙,不能进入
'S': 小狗现在的位置
'D': 门
'.': 空地
输出格式
根据能否成功逃离,输出“YES” 或者“NO”
蒟蒻代码:
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,m,t,a[N][N],dx[]={1,-1,0,0},dy[]={0,0,1,-1},vs[N][N],sx,sy,ex,ey;
char s[N][N];
bool check(int x,int y){
return x>=0&&x<n&&y>=0&&y<m&&(!vs[x][y])&&s[x][y]!=x;
}
bool dfs(int x,int y,int t){
if(abs(x-ex)+abs(y-ey)>t) return 0;
if(x==ex&&y==ey) return t==0;
int tx,ty;
for(int i=0;i<4;++i){
tx=x+dx[i];
ty=y+dy[i];
if(check(tx,ty)){
vs[tx][ty]=1;
if(dfs(tx,ty,t-1)) return 1;
vs[tx][ty]=0;
}
}
return 0;
}
int main(){
cin>>n>>m>>t;
for(int i=0;i<n;++i){
cin>>s[i];
for(int j=0;j<m;++j){
if(s[i][j]=='S') sx=i,sy=j;
if(s[i][j]=='D') ex=i,ey=j;
}
}
if((abs(sx-ex)+abs(sy-ey))%2!=t%2) cout<<"NO";
else cout<<(dfs(sx,sy,t)?"YES":"NO");
return 0;
}
70tps求改进