新学dfs(看懂了)

时间:2022-04-22 16:10:16

在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
#include "bits/stdc++.h"
using namespace std;
int n;
char a[][];
int mark[][]; void dfs(int x,int y)
{
if(x==||y==||x>n||y>n)
return;
if(mark[x][y] == )
{
mark[x][y] = ;
if(a[x+][y] == '.'||a[x+][y] == 'e')
dfs(x+,y);
if(a[x-][y] == '.'||a[x-][y] == 'e')
dfs(x-,y);
if(a[x][y+] == '.'||a[x][y+] == 'e')
dfs(x,y+);
if(a[x][y-] == '.'||a[x][y-] == 'e')
dfs(x,y-);
}
} int main()
{
int m;
cin >> m;
while(m--)
{ cin >> n;
for(int i=;i < ;i++) //mark == 0
for(int j=;j < ;j++)
mark[i][j] = ; for(int i=;i <= n;i++)
for(int j=;j <= n;j++)
cin >> a[i][j]; dfs(,); if(mark[n][n] == )
cout << "YES" <<endl;
else
cout << "NO" <<endl; }
return ;
}

总的来说就是递归,比较好理解。