3分钟弄懂深度优先搜索[DFS]

深度优先搜索

介绍

假设有这么一张地图:
在这里插入图片描述

其中:

  • 1 表示墙壁,0 表示可以走的路

🤔 思考:如何找到一条路可以从左上角走到右下角?

左上角的坐标记为(0, 0),右下角的坐标记为(4, 4)

预处理

准备一个和 map 等大的布尔型二维数组数组 vis,并且全部初始化为false代表没有走过。

在这里插入图片描述

其中记录了 map 每个位置是否走过,如果经过一个路就标记为true代表已经走过。

每一次判断四个方向能否走

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备四个向量表示四个走的方向:

表示:上下左右
在这里插入图片描述

目前的坐标加上向量就可用来表示四个方向。

Coding

#include <vector>
using namespace std;

//map记录地图的墙壁
vector<vector<int>> map = {
		{0, 1, 0, 1, 0},
		{0, 1, 0, 1, 1},
		{0, 0, 0, 0, 1},
		{0, 1, 1, 0, 1},
		{0, 1, 0, 0, 0}
};
//vis记录路径是否走过
vector<vector<bool>> vis(map.size(), vector<bool>(map[0].size(), false));

//方向向量
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};

//flag记录是否已经找到一个目标
bool flag = false;

inline void deepSearch(int x, int y) {
	if (flag == true) {
		return;
	}//如果找到一条路径了就不再找了
	if (x == 4 || y == 4) {
		flag = true;
		return;
	}//走到终点就返回

	vis[x][y] = true;//走过的路标记为true

	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i], ny = y + dy[i];
		//对于接下来的四个方向进行判断
		if (nx < 0 || nx > 4 || ny < 0 || ny > 4) {//判断是否出界
			continue;//判断下一个方向
		}
		if (map[nx][ny] == 0 && vis[nx][ny] == false) {//没有墙壁 并且 没有走过
			deepSearch(nx, ny);
		}
	}
}

int main() {
	//1表示墙壁,0表示可以走的路
	//目标:找到一条(0, 0) -> (4, 4)的路径
	deepSearch(0, 0);
	//这是一个没有做任何事情的深搜
}

🤔 改进

如何打印出路径呢?

几种方法:

  1. 将深度优先从递归的系统栈改成手动压栈
  2. 记录每个结点的前驱最后倒着找前驱即可
  3. 如果当前位置出栈,在vis中设置为false,最后true为走过的路

相关推荐

  1. 深度优先搜索DFS)算法深入探索与实践

    2024-03-20 08:38:04       37 阅读
  2. c语言深度优先搜索 (Depth-First Search,DFS

    2024-03-20 08:38:04       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-20 08:38:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-20 08:38:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-20 08:38:04       87 阅读
  4. Python语言-面向对象

    2024-03-20 08:38:04       96 阅读

热门阅读

  1. MongoDB聚合运算符:$hour

    2024-03-20 08:38:04       39 阅读
  2. 双向队列(Double-ended Queue)

    2024-03-20 08:38:04       42 阅读
  3. ElementUI+sortablejs实现列表拖拽功能

    2024-03-20 08:38:04       45 阅读
  4. React——关于表单元素

    2024-03-20 08:38:04       51 阅读
  5. 离散制造企业MES与流程企业MES的区别

    2024-03-20 08:38:04       36 阅读
  6. React.js快速入门教程

    2024-03-20 08:38:04       44 阅读
  7. 虚拟DOM是什么以及React 和Vue中有何区别

    2024-03-20 08:38:04       38 阅读
  8. 华岳M9制造企业管理软件业务流程 2/4

    2024-03-20 08:38:04       44 阅读
  9. 北斗校时服务器(GPS授时服务器,NTP同步时钟)

    2024-03-20 08:38:04       43 阅读
  10. uniapp小程序接入trtc-wx

    2024-03-20 08:38:04       37 阅读