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,避免陷入死循环中(一直在转圈)

核心代码:
 1 #include<iostream>
 2 using namespace std;
 3 char mi[1000][1000];
 4 int ma[1000][1000], mark = 0, ax, ay;
 5 int m, n;
 6 int z, j, haha;
 7 
 8 void dfs(int x, int y)
 9 {
10     if (mi[x][y] == 'e')
11     {
12         cout << "YES" << endl;
13         mark = 1;
14         return;
15     }
16     if (x<1 || y<1 || x>n || y>n || mi[x][y] == '#' || ma[x][y] == 1)
17         return;
18     ma[x][y] = 1;//不需要回溯,因为只需要找一种情况 
19     dfs(x + 1, y);
20     dfs(x - 1, y);
21     dfs(x, y + 1);
22     dfs(x, y - 1);
23 }
24 int main()
25 {
26     cin >> m;
27     for (int i = 1; i <= m; i++)
28     {
29         cin >> n;
30         for (j = 1; j <= n; j++)
31             for (z = 1; z <= n; z++)
32             {
33                 cin >> mi[j][z];
34             }
35         dfs(1, 1);
36         if (mark == 0)
37             cout << "NO" << endl;
38     }
39     return 0;
40 }

猜你喜欢

转载自www.cnblogs.com/Diligent-Memory/p/10535102.html
今日推荐