题解 | #wyh的迷宫#
wyh的迷宫
https://ac.nowcoder.com/acm/problem/15434
BFS模板
//BFS模板
//原模板为求最短路径,该题为判断是否能走到终点
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 510;
char g[N][N];int dist[N][N];
typedef pair<int,int> PII;
PII q[N*N];
int startx=0,starty=0;
int endx=0,endy=0;
int bfs(int n,int m)
{
int hh=0,tt=0;//使用队列模拟
q[0]={startx,starty};//存入起点坐标
memset(dist,-1,sizeof dist);//初始化距离数组
dist[startx][starty]=0;//把起点的距离初始化为0
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//坐标移动模拟
while(hh<=tt)
{
auto t=q[hh++];
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x >= 0 && x < n && y >= 0 && y < m && (g[x][y] == '.' || g[x][y] == 't' || g[x][y] == 's')&& dist[x][y] == -1)//满足不越界 且 可走 且 尚未走过时更新路径
{
dist[x][y]=dist[t.first][t.second]+1;
q[++tt]={x,y};
}
}
}
return dist[endx][endy];//
}
int main()
{
int T;cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
if(g[i][j]=='t')
{
endx=i,endy=j;
}
else if(g[i][j] == 's')
{
startx=i,starty=j;
}
}
}
if(bfs(n,m) != -1)//如果终点走过
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}