寻找最短路径和最小生成树的算法需要考虑遍历顶点和边的顺序,但是,在一些算法中,不需要考虑访问顶点的顺序,采用系统的顺序来访问顶点。在本篇文章中,我们主要介绍其中的深度优先搜索。
定义
深度优先搜索是一种强有力的遍历方法,本质是前序遍历的推广。设 G ( V , E ) G(V,E) G(V,E)一个图,G的深度优先搜索如下:首先在所有顶点都标上未访问,接着选择一个起始节点,比如 v v v, 标注已访问。假设 w w w是邻接于 v v v的任一顶点,我们把w标注已访问并前进至另一个顶点…
伪代码
主函数
1. predfn <- 0; postfn <- 0;
2. for 每个顶点 v 属于 V
3. 标记v未访问
4. end for
5. for 每个顶点 v 属于 V
6. if v未访问 then dfs(v)
7. end for
子函数
dfs(v)
1. 标记v已访问
2. predfn <- predfn + 1
3. for 每条边(v, w)属于E
4. if w标记为未访问 then dfs(w)
5. end for
6. postfn <- postfn + 1
应用
Leetcode–矩阵中的路径1
示例:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def dfs(i, j, k):
# 首先,判断异常情况,主要包含边界溢出以及当前值不符合要求
if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]:
return False
# 设置递归中止条件
if k == len(word) - 1 :
return True
# 将已访问的位置赋值,将当前位置的值赋予temp
temp, board[i][j] = board[i][j], ''
k = k+1
result = dfs(i+1, j, k) or dfs(i, j+1, k) or dfs(i, j-1, k) or dfs(i-1, j, k)
# 再次将访问位置的值赋值回到原位置,以用于下次的遍历
# 一次深度遍历结束之后,需要将原始的矩阵复原
board[i][j] = temp
return result
for i in range(len(board)):
for j in range(len(board[0])):
# 如果存在对应的组合
if dfs(i, j, 0):
return True
return False
参考代码:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/ ↩︎