迷宫---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
- 迷宫---DFS和BFS解法
- POJ 3984 迷宫问题 BFS DFS两种解法
- 迷宫 DFS 递归 解法
- 迷宫 DFS 递归 解法
- 迷宫路径(bfs和dfs)
- 迷宫问题 dfs bfs
- BFS,DFS,迷宫
- UVA - 10004 Bicoloring (dfs和bfs两种解法)
- 迷宫求解非递归 DFS BFS(应用栈和队列)
- 迷宫最短路径dfs和bfs代码分析
- 迷宫和树等的BFS及DFS
- 3752:走迷宫 bfs dfs
- poj3083 dfs+bfs搜索迷宫
- DFS/BFS 关于迷宫问题
- BFS和DFS的差别,BFS实现迷宫最短路径
- leetCode-Surrounded Regions DFS与BFS解法
- POJ 2251 (三维迷宫问题) DFS /BFS
- (dfs+bfs+记录)迷宫问题(P3984)
- android WebView加载html 并 引用本地资源(图片、字体库)
- 约瑟夫问题(丢手帕问题)的数组实现
- 计算机是如何工作的总结
- 1094. The Largest Generation (25) 此题和六度空间一个道理,记录BFS的层次
- iOS模拟器URLWithString The operation couldn't be completed. (Cocoa error 256.)
- 迷宫---DFS和BFS解法
- VS2012 Express编译log4cplus图文教程
- 2015 HNU warm up 12
- HDU 1398 Square Coins
- 最长公共子序列Common Subsequence POJ1458
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- 关于oracle数据库忘记超级管理员密码的问题
- NYOJ---6(贪心)-题目---------------------------------喷水装置(一)
- Add Two Numbers