CODEVS-1215迷宫

时间:2023-03-09 21:21:13
CODEVS-1215迷宫

迷宫

原题:传送门

题目描述 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

解题思路:1.首先,题目要求很明确从左上角s能不能走到右下角e,其实起点和终点在哪里都无所谓,我们只需要找到一条路到达终点即可
2.虽然很容易想到是深搜,但是不需要回溯(没说求出最短距离,可以自己练练),所以深搜时向4个方向都递归一次即可
3.还需要设置一个标记数组mark,避免陷入死循环中(一直在转圈) 核心代码:
 #include<iostream>
using namespace std;
char mi[][];
int ma[][], mark = , ax, ay;
int m, n;
int z, j, haha; void dfs(int x, int y)
{
if (mi[x][y] == 'e')
{
cout << "YES" << endl;
mark = ;
return;
}
if (x< || y< || x>n || y>n || mi[x][y] == '#' || ma[x][y] == )
return;
ma[x][y] = ;//不需要回溯,因为只需要找一种情况
dfs(x + , y);
dfs(x - , y);
dfs(x, y + );
dfs(x, y - );
}
int main()
{
cin >> m;
for (int i = ; i <= m; i++)
{
cin >> n;
for (j = ; j <= n; j++)
for (z = ; z <= n; z++)
{
cin >> mi[j][z];
}
dfs(, );
if (mark == )
cout << "NO" << endl;
}
return ;
}