题目描述 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
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 20;
int vis[maxn][maxn],n,flag;
char map[maxn][maxn];
int xx[5]={0,-1,1,0,0};
int yy[5]={0,0,0,-1,1};
void dfs(int x,int y)
{
int i;
vis[x][y]=1;
if(map[x][y]=='e')
{
flag=1;
return ;
}
for(i=1;i<=4;i++)
{
if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n && map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0)
{
dfs(x+xx[i],y+yy[i]);
}
/*把两个if合并,时间更少
if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n )
{
if( map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0)
dfs(x+xx[i],y+yy[i]);
}*/
}
}
int main ()
{
int T,i,j;
cin>>T;
while(T--)
{
cin>>n;
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>map[i][j];
flag=0;
dfs(0,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}