typo;为代码块添加 cpp 语言高亮

This commit is contained in:
El nino
2023-07-23 10:12:24 +08:00
parent 59f461608f
commit c1da5bb233

View File

@ -16,13 +16,13 @@
## dfs 与 bfs 区别 ## dfs 与 bfs 区别
提到深度优先搜索dfs就不得不说和广度优先有什么区别bfs 提到深度优先搜索dfs就不得不说和广度优先搜索bfs有什么区别
先来了解dfs的过程很多录友可能对dfs深度优先搜索bfs广度优先搜索分不清。 先来了解dfs的过程很多录友可能对dfs深度优先搜索bfs广度优先搜索分不清。
先给大家说一下两者大概的区别: 先给大家说一下两者大概的区别:
* dfs是可一个方向去搜不到黄河不回头直到遇到绝境了搜不下去了换方向(换方向的过程就涉及到了回溯)。 * dfs是可一个方向去搜不到黄河不回头直到遇到绝境了搜不下去了换方向(换方向的过程就涉及到了回溯)。
* bfs是先把本节点所连接的所有节点遍历一遍走到下一个节点的时候再把连接节点的所有节点遍历一遍搜索方向更像是广度四面八方的搜索过程。 * bfs是先把本节点所连接的所有节点遍历一遍走到下一个节点的时候再把连接节点的所有节点遍历一遍搜索方向更像是广度四面八方的搜索过程。
当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfsbfs在用单独一篇文章详细讲解 当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfsbfs在用单独一篇文章详细讲解
@ -60,26 +60,26 @@
上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs深度优先搜索的过程都画出来那样太冗余了但 已经把dfs 关键的地方都涉及到了,关键就两点: 上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs深度优先搜索的过程都画出来那样太冗余了但 已经把dfs 关键的地方都涉及到了,关键就两点:
* 搜索方向,是认准一个方向搜,直到碰壁之后换方向 * 搜索方向,是认准一个方向搜,直到碰壁之后换方向
* 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 * 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。
## 代码框架 ## 代码框架
因为dfs搜索可一个方向并需要回溯所以用递归的方式来实现是最方便的。 因为dfs搜索可一个方向并需要回溯所以用递归的方式来实现是最方便的。
很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。
有递归的地方就有回溯,那么回溯在哪里呢? 有递归的地方就有回溯,那么回溯在哪里呢?
就地递归函数的下面,例如如下代码: 就地递归函数的下面,例如如下代码:
``` ```cpp
void dfs(参数) { void dfs(参数) {
处理节点 处理节点
dfs(图,选择的节点); // 递归 dfs(图,选择的节点); // 递归
回溯,撤销处理结果 回溯,撤销处理结果
} }
``` ```
可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。
@ -89,7 +89,7 @@ void dfs(参数) {
我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: 我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架:
``` ```cpp
void backtracking(参数) { void backtracking(参数) {
if (终止条件) { if (终止条件) {
存放结果; 存放结果;
@ -102,11 +102,11 @@ void backtracking(参数) {
} }
} }
``` ```
回溯算法其实就是dfs的过程这里给出dfs的代码框架 回溯算法其实就是dfs的过程这里给出dfs的代码框架
``` ```cpp
void dfs(参数) { void dfs(参数) {
if (终止条件) { if (终止条件) {
存放结果; 存放结果;
@ -136,9 +136,9 @@ void dfs(参数) {
1. 确认递归函数,参数 1. 确认递归函数,参数
``` ```cpp
void dfs(参数) void dfs(参数)
``` ```
通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。
@ -146,7 +146,7 @@ void dfs(参数)
例如这样: 例如这样:
``` ```cpp
vector<vector<int>> result; // 保存符合条件的所有路径 vector<vector<int>> result; // 保存符合条件的所有路径
vector<int> path; // 起点到终点的路径 vector<int> path; // 起点到终点的路径
void dfs (图,目前搜索的节点) void dfs (图,目前搜索的节点)
@ -158,7 +158,7 @@ void dfs (图,目前搜索的节点)
终止条件很重要很多同学写dfs的时候之所以容易死循环栈溢出等等这些问题都是因为终止条件没有想清楚。 终止条件很重要很多同学写dfs的时候之所以容易死循环栈溢出等等这些问题都是因为终止条件没有想清楚。
``` ```cpp
if (终止条件) { if (终止条件) {
存放结果; 存放结果;
return; return;
@ -173,7 +173,7 @@ if (终止条件) {
一般这里就是一个for循环的操作去遍历 目前搜索节点 所能到的所有节点。 一般这里就是一个for循环的操作去遍历 目前搜索节点 所能到的所有节点。
``` ```cpp
for (选择:本节点所连接的其他节点) { for (选择:本节点所连接的其他节点) {
处理节点; 处理节点;
dfs(图,选择的节点); // 递归 dfs(图,选择的节点); // 递归