经典迷宫问题DFS

该博客探讨了如何利用深度优先搜索(DFS)解决一个经典的迷宫问题,其中起点位于左上角,终点位于右下角。文章指出,路径可以朝八个方向移动,用0表示可通行,1表示障碍。通过将迷宫边界用1包围,可以简化边界处理。内容中详细解释了DFS算法在解决此类问题的应用。

给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可以用1将迷宫围起来避免边界问题。

本题采用DFS算法给出解。

/*
迷宫问题(八方向)
input:
1
6 8
0 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0
0 1 0 0 1 1 1 1
0 1 1 1 0 0 1 1
1 0 0 1 1 0 0 0
0 1 1 0 0 1 1 0
output:
YES
(1,1) (2,2) (3,1) (4,1) (5,2) (5,3) (6,4) (6,5) (5,6) (4,5) (4,6) (5,7) (5,8) (6,8) (递归)
(1,1) (2,2) (3,3) (3,4) (4,5) (5,6) (5,7) (6,8) (栈)
*/
#include<iostream>
#include<stack>
using namespace std;
struct point{
    int x;
    int y;
};
int **Maze;
stack<point> sp;
point move[8]={
  
  {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
void Create(int row,int column){
    //创建迷宫,注意到用0表示可走,1表示墙,将整个输入的迷宫再用墙围着,处理的时候就不用特别注意边界问题
    int i,j;
    for(i=0; i<row+2; i++)
		Maze[i][0] = Maze
### 迷宫问题中的DFS和BFS算法 #### DFS(深度优先搜索) 在迷宫求解中,DFS采用的是深入探索的方式直到无法继续前进为止再回溯其他可能路径的方法。该方法利用栈结构来记录访问过的节点以及当前所处位置,在遇到死胡同时会返回上一步并尝试新的方向[^1]。 对于迷宫问题而言,当仅需找到一条从起点到终点的有效路径而不在乎是否为最短路径时,DFS是一个不错的选择;然而其缺点在于可能会遍历较多不必要的分支从而浪费时间资源[^2]。 ```cpp void dfs(int x, int y){ if (maze[x][y] == END){ // 到达出口 success = true; return ; } visited[x][y] = true; // 标记已走过 for (int i=0;i<4;++i){ // 尝试四个方向移动 int nx=x+dx[i], ny=y+dy[i]; if (!success && isValid(nx,ny)){ path.push_back({nx,ny}); dfs(nx,ny); if(!success) path.pop_back(); // 回溯 } } } ``` #### BFS(广度优先搜索) 相比之下,BFS则更倾向于一层层向外扩展邻居结点直至触及目标点位停止。此过程借助队列完成,每次都将新发现却未曾踏足之处加入待处理列表之中等待后续考察。由于这种特性决定了它总能最先抵达离起始最近的目的地因此特别适合用来寻找两点间最短距离的问题场景下使用[^3]。 ```cpp bool bfs(){ queue<pair<int,int>> q; vector<vector<bool>> seen(rows,vector<bool>(cols,false)); q.emplace(startX,startY); seen[startX][startY]=true; while(!q.empty()){ auto [cx,cy]=q.front(); q.pop(); if(maze[cx][cy]==END) return true; for(auto& d : directions){ int nx=cx+d.first , ny=cy+d.second ; if(isValid(nx,ny)&&!seen[nx][ny]){ parent[{nx,ny}]={cx,cy}; seen[nx][ny]=true; q.emplace(nx,ny); } } } return false; } ``` #### 应用对比 - **适用范围** - 如果只需要知道是否存在通路而不关心具体长度,则可以考虑效率较高的DFS。 - 若要获取确切的最短路线方案,则应选用能够保证首次到达即最优解特性的BFS。 - **性能考量** - 对于较小规模的地图数据集来说两者差异不大; - 随着地图尺寸增大,考虑到内存占用等因素影响,通常认为BFS所需额外存储空间较大因为它要保存每一层所有未被探测过的位置信息以便下一步操作,所以实际运行速度未必优于DFS。 - **实现难度** - 实现方面二者都较为简单直观易于理解掌握,但在编码细节上有一定差别比如循环终止条件判断、边界情况处理等都需要仔细斟酌确保逻辑严谨无误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值