迷宫---DFS和BFS解法

来源:互联网 发布:网络防骗小常识 编辑:程序博客网 时间:2024/06/06 16:43
题目描述 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
数据范围及提示 Data Size & Hint
先讲讲DFS的解法,就是普通的搜索,从一个位置向四个方向搜索,但要记得要用一个记录数组记录一下当前位置是否被同样的方式访问过
#include<stdio.h>#include<string.h>#define N 25char map[N][N];bool visited[N][N][5];int n, flag;//i,j代表坐标,d代表方向void dfs(int i, int j, int d){if (flag == 1 || visited[i][j][d])return;if (map[i][j] == 'e'){flag = 1;printf("YES\n");}visited[i][j][d] = 1;//如果当前位置不是前一个位置向下走, 则可以向上走if (d != 2 && map[i - 1][j] != '#' && i - 1 >= 0)dfs(i - 1, j, 1);if (d != 1 && map[i + 1][j] != '#' && i + 1 < n)dfs(i + 1, j, 2);if (d != 4 && map[i][j - 1] != '#' && j - 1 >= 0)dfs(i, j - 1, 3);if (d != 3 && map[i][j + 1] != '#' && j + 1 < n)dfs(i, j + 1, 4);}int main(){int m;scanf("%d", &m);while (m--){flag = 0;memset(visited, 0, sizeof(visited));scanf("%d", &n);int i;for (i = 0; i < n; i++)scanf("%s", map[i]);dfs(0, 0, 0);if (flag == 0)printf("NO\n");}return 0;}

然后再讲讲BFS解法,这里有BFS的代码比较长,主要是手撸个栈,
BFS更是没什么改变,就是起点入栈,然后开始判空栈,非空则出栈,然后出栈位置的四个方向的点满足条件的就可以入栈
#include<stdio.h>#include<string.h>#define N 25char map[N][N];bool visited[N][N];struct Node{int x, y;};struct Queue{Node a[10000];int head, rear;Queue(){ head = 0; rear = 0; }void push(int i, int j){a[rear].x = i;a[rear++].y = j;}void pop(Node *b){b->x = a[head].x;b->y = a[head].y;head++;}bool isEmpty(){return head >= rear;}}q;int main(){int m, n;scanf("%d", &m);while (m--){int flag = 0;memset(visited, 0, sizeof(visited));scanf("%d", &n);int i;for (i = 0; i < n; i++)scanf("%s", map[i]);visited[0][0] = 1;q.push(0, 0);while (!q.isEmpty()){Node b;q.pop(&b);//如果当前位置下面的点可以走if (!visited[b.x + 1][b.y] && map[b.x + 1][b.y] != '#' && b.x + 1 < n){if (map[b.x + 1][b.y] == 'e'){flag = 1;break;}visited[b.x + 1][b.y] = 1;q.push(b.x + 1, b.y);}//如果当前位置上面的点可以走if (!visited[b.x - 1][b.y] && map[b.x - 1][b.y] != '#' && b.x - 1 >= 0){if (map[b.x - 1][b.y] == 'e'){flag = 1;break;}visited[b.x - 1][b.y] = 1;q.push(b.x - 1, b.y);}//如果当前位置右面的点可以走if (!visited[b.x][b.y + 1] && map[b.x][b.y + 1] != '#' && b.y + 1 < n){if (map[b.x][b.y + 1] == 'e'){flag = 1;break;}visited[b.x][b.y + 1] = 1;q.push(b.x, b.y + 1);}//如果当前位置左面的点可以走if (!visited[b.x][b.y - 1] && map[b.x][b.y - 1] != '#' && b.y - 1 >= 0){if (map[b.x][b.y - 1] == 'e'){flag = 1;break;}visited[b.x][b.y - 1] = 1;q.push(b.x, b.y - 1);}}if (flag == 0)printf("NO\n");else printf("YES\n");}return 0;}


1 0