题目描述
Description
在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
输入描述 Input Description
输入的第一行为一个整数m,表示迷宫的数量。
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。
输出描述 Output Description
输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。
样例输入 Sample Input
1 7 s...##. .#..... ....... ..#.... ..#...# ###...# ......e
样例输出 Sample Output
YES
数据范围及提示 Data Size & Hint
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
char map[16][16]={0};
int vis[16][16]={0};
int n;
int x1,y1,x2,y2;
int tt=0;
int dir[4][2]={-1,0,1,0,0,-1,0,1};//四个方向
typedef struct node
{
int x,y;
}No;
queue<node>Q;
void bfs()
{
int i,s,t;
No a={x1,y1};
Q.push(a);//将可以走的方格差入队列
vis[x1][y1]=1;//标记已走
while(!Q.empty())
{
a=Q.front();
if(a.x ==x2 && a.y == y2)
{
tt=1;
printf("YES\n");//找到出口
return;
}
Q.pop();//取出第一个元素
for(i=0;i<4;i++)
{
s=a.x+dir[i][0];
t=a.y+dir[i][1];
if(s>=0 && s<n && t>=0 &&t<n && !vis[s][t] &&(map[s][t]=='.'||map[s][t]=='e'))//符合可以走的条件
{
No a1={s,t};
Q.push(a1);//差入队列
vis[s][t] =1;
}
}
}
}
int main()
{
int xn;
scanf("%d", &xn);
while(xn--)
{
tt=0;
scanf("%d", &n);
for(int i=0;i<n;i++)
scanf("%s", map[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='s')
x1=i,y1=j;
if(map[i][j]=='e')
x2=i,y2=j;
}
}
bfs();
if(tt==0)
printf("NO\n");
}
}