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 }