AT_abc308_d [ABC308D] Snuke Maze 题解
大家好,我是 Ray2009_,这是我这个蒟蒻的第一篇 gosh 题解。
前言:
这道题不知为何只有 BFS 的算法题解,于是热爱暴力(菜)的我用一篇 DFS 题解把思路理顺,复习一下(当然不是为了钻空子刷估值)~。
思路:
首先我们定义字符串
代码如下(坑点和细节在下面有标注):
AC记录
https://www.luogu.com.cn/record/187037667
#include<bits/stdc++.h>//万能头
using namespace std;
int n,m;
char s[508][508];
bool b[508][508];//标记用
bool f=0;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
string p="snuke";
inline int read(){//快读,其实可以不加
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
bool ck(int x,int y){//检查越界,写在下面可能会有点乱
if(x<1||x>n||y<1||y>m) return 0;
return 1;
}
void dfs(int x,int y,int c){
if(x==n&&y==m){//到边界就退出
f=1;
return;
}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(ck(nx,ny)&&!b[nx][ny]&&s[nx][ny]==p[(c+1)%5]){//判断是否是正确线路上的点
b[nx][ny]=1;//是的话就标记
dfs(nx,ny,c+1);
//注:这里不需要 b[nx][ny] = 0;,因为一个点没必要搜多次,写的话会TLE。
}
}
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) cin>>s[i][j];//输入
if(s[1][1]=='s') dfs(1,1,0);//初始设s
if(f) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}