一、概念
深度优先搜索(简称
DFS
),其工作原理为不撞南墙不回头,能深则深,不能则退。最差情况下的时间复杂度为 O ( a n ) O(a^n) O(an), a a a 为可选条数。
二、典型题目
1. 题目
给定一个 n n n 行 m m m 列的迷宫,有些格子可以走,有些有障碍物不能到达。每步可以走到上下左右的格子中。请你判断,是否能从左上角走到右下角。如果能走到输出 YES
,否则输出 NO
。迷宫中字符为 *
表示迷宫这个格子有障碍物,.
表示没有障碍物。
2. 分析
不能走的地方
- 迷宫的边界
- 遇到障碍物
- 走回头路
DFS
的功能
在一个点遍历 4 4 4 个方向,如果这个方向上的点满足条件,去下一个点。
伪代码
dfs(x, y)
if (x == n && y == m)
stop
if (isRoad(a[?][?]))
dfs(?, ?);
...
3. 参考答案
#include <iostream>
using namespace std;
int n, m; // 迷宫大小
bool flag; // 是否有解
char Map[25][25]; // 地形图
bool vis[25][25]; // 标记是否走过
int dx[5] = {
-1, 0, 1, 0}