洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。
Input
多组测试数据。
每组数据输入第一行为正整数n,表示迷宫大小。
接下来n行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'#'表示该位置为墙壁,字符'S'表示该位置为入口,字符'E'表示该位置为宝藏,输入数据中只有这四种字符,并且'S'和'E'仅出现一次。
n≤1000
Output
输出拿到宝藏最少需要走的步数,若永远无法拿到宝藏,则输出-1。
#include<bits/stdc++.h>
using namespace std;
int ex,ey;
int n;
int fx[4][2]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};//走位方向数组
int bz[20][20];//标志遍历情况数组
char lk[20][20];//原始路况数组
struct node//用结构体保存当前的位置x.y和当前所用步数step
{
int x;
int y;
int step;
};
int bfs(int c,int d)//广度优先搜索算法
{
queue<node>q;
node now,temp,pre;
pre.x=c;
pre.y=d;
pre.step=0;
q.push(pre);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==ex&&now.y==ey)//到达指定地点
{
return 1;
}
for(int i=0;i<4;i++)//遍历四个可走的方向
{
temp.x = now.x+fx[i][0];
temp.y = now.y+fx[i][1];
temp.step = now.step + 1;
if(temp.x>=1&&temp.y>=1&&temp.x<=n&&temp.y<=n&&lk[temp.x][temp.y]!='#'&&bz[temp.x][temp.y]==0)//判断当前路段是否可走
{
q.push(temp);
bz[temp.x][temp.y]=1; //可走标志为1表示已经遍历过了
}
}
}
return 0;
}
int main()
{
int t=0;
cin>>t;
while(t--)
{
//int n=0;
cin>>n;
int a=0,b=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>lk[i][j];
if(lk[i][j]=='s')//找起点
{
a=i;
b=j;
}
if(lk[i][j]=='e')//找终点
{
ex=i;
ey=j;
}
}
}
int flag=0;
flag=bfs(a,b);
if(flag==0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}