站外题求教玄关
  • 板块学术版
  • 楼主jzm_2024
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/2 21:50
  • 上次更新2025/2/3 12:35:15
查看原帖
站外题求教玄关
1384623
jzm_2024楼主2025/2/2 21:50

题目描述
在一个迷宫里面有一只小狗发现了一根骨头,现在他准备逃出迷宫,迷宫中只有一个地方有门可以出去,而且这个门只会在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;
}

70tps70tps求改进

2025/2/2 21:50
加载中...