DFS与BFS入门(迷宫问题)

DFS深度优先遍历,侧重于探寻是否有出路,采用递归思想,常常调用函数自身,设置终止的条件,以寻找出路。

BFS广度优先遍历,侧重于探寻出路个数及长短,采用队列思想,将矩阵或图周围的顶点放入队列中然后利用队列先进先出的性质依次遍历。

从例题中感知:

例题:

方形迷宫:现有正方形数字迷宫,其中0表示可以通行,1表示阻塞,第一行输入迷宫的边长(行和列),第二行输入具体的阻塞物(0和1)。

1.用dfs探寻是否可以通行。即:从左上角走到右下角。若可以输出1,若不可输出0。

2.用bfs探寻通路的长短。(保证有一条可通)。输出通路的长度。

dfs代码:

#include <iostream>
using namespace std;
const int N=100;
int n;
int mp[N][N], vis[N][N];
bool fg=false;
int dx[4]={0,0,-1,1} ;
int dy[4]={-1,1,0,0} ;
bool check(int nx,int ny)
{
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==false&&mp[nx][ny]==0)
  return true;;
  return false;
}
void dfs(int x,int y)
{  if(vis[x][y]||fg==true) return;
   if(x==n-1&&y==n-1){ fg=true; }
   vis[x][y]=true;
   for(int i=0;i<4;i++)
   {
       int nx=x+dx[i];
       int ny=y+dy[i];
    if(check(nx,ny))dfs(nx,ny);

   }

}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
         cin>>mp[i][j];
     dfs(0,0);
     //bool fg1=true;
     cout<<fg<<endl;


}

bfs:

#include <queue>
#include <iostream>
using namespace std;
const int N=100;
int n;
int mp[N][N];
bool vis[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
struct Edge
{int x;int y;int w;};
bool check(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=n&&vis[x][y]==false&&mp[x][y]==0) return true;
return false;

}
int bfs()
{ queue<Edge> que;
  que.push({1,1,1});
  //vis[0][0]=true;
  while(!que.empty())
    {Edge p=que.front();//cout<<123<<endl;
     que.pop();
     //cout<<p.x<<" "<<p.y<<endl;
     if(p.x==n&&p.y==n) {return p.w;}
     if(vis[p.x][p.y]) continue;
     vis[p.x][p.y]=true;
     for(int i=0;i<4;i++)
     {
      int nx=p.x+dx[i];
      int ny=p.y+dy[i];
      if(check(nx,ny))
      que.push({nx,ny,p.w+1});
     }
    }

}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
 for(int j=1;j<=n;j++)
    cin>>mp[i][j];
cout<<bfs();


}

读代码,体会思想。

### DFSBFS算法迷宫问题中的应用 #### 一、DFS深度优先搜索) DFS是一种深入探索的方法,在处理迷宫问题时,该方法会选择一条路径尽可能地走下去直到无法继续为止。如果遇到死胡同,则会回退到上一步并尝试其他可能的方向。这种方法可能会找到到达终点的一条路径,但这不一定是最短路径。 ```python def dfs(maze, start, end): stack = [start] visited = set() while stack: pos = stack.pop() if pos == end: return True if pos not in visited: visited.add(pos) for next_pos in get_adjacent_positions(maze, pos): if next_pos not in visited and maze[next_pos[0]][next_pos[1]] != '#': stack.append(next_pos) return False ``` 此代码片段展示了如何利用栈来追踪访问过的节点,并通过递归来遍历迷宫中的每一个分支[^1]。 #### 二、BFS(广度优先搜索) 相比之下,BFS采用逐层扩展的方式来进行搜索。对于迷宫来说,这意味着它将从起点开始逐步向外扩散,每次只前进一小步,从而确保最先发现的目标位置即为最短距离上的目标位置。因此,当涉及到寻找两点间最优路线时,通常推荐使用BFS而非DFS。 ```python from collections import deque def bfs(maze, start, end): queue = deque([start]) visited = {start: None} while queue: current = queue.popleft() if current == end: break for neighbor in get_adjacent_positions(maze, current): if neighbor not in visited and maze[neighbor[0]][neighbor[1]] != '#': visited[neighbor] = current queue.append(neighbor) path = [] while end is not None: path.append(end) end = visited[end] return list(reversed(path)) ``` 上述Python函数实现了基于队列的数据结构执行标准的BFS过程,能够有效地定位从起始点至目的地之间的最佳路径[^2]。 #### 三、两者的主要区别 - **搜索模式**: DFS倾向于沿着单一路线持续前行直至尽头;而BFS则更像水波一样一圈圈地向四周蔓延。 - **适用场景**: 如果只需要知道是否存在通路而不关心具体长度的话可以选择效率较高的DFS;但如果要获取确切的距离信息或最小化行走成本,则应考虑使用BFS。 - **内存消耗**: 因为需要保存每一层的状态,所以随着层数增加,BFS占用的空间也会相应增大;相反,由于其特性使得DFS可以在较早阶段就完成任务,故一般情况下所需的额外存储较少[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值