【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )

【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )_第1张图片

这道题让我们用数学来解,应该很容易写出来

【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )_第2张图片

就像这样分叉,得到不同方案。

用代码实现就要讲到我们今天要学的DFS深度优先搜素。

思想

我们实现DFS算法其实并不需要真的创建一棵树(虽然很容易想到树)。

DFS思想:从根节点开始,沿着一条路径尽可能深地搜索,直到达到最深处,然后回溯到上一个可选择另一条路径的节点处,选择其他路径继续搜索,直至遍历完所有可能的路径。

图示

【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )_第3张图片可以明白哈。

[AcWing]842. 排列数字(C++实现)dfs模板题,递归思想的解释

这篇文章作者将dfs的思想与递归思想的联系做了详细的解释,并呈现递归过程,非常推荐看一下。我属于是默认直接接受了使用递归的方式,没有深入思考二者的联系,,,  

代码如下

#include
using namespace std;
const int N=10;
int n;
int path[N];//用来存储可行的方案 
bool st[N];//st用来标记用过的数字

void dfs(int u)
{
    //u=n表示找到了一种方案
    if(u==n){
        for(int i=0;i

需要解释的部分都在注释里了。

递归过程图示 

【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )_第4张图片

按代码执行一边递归过程可以帮助理解。画的有些乱emm,可以按照划圈①②这些标号看每一步,那些箭头从始端开始看,没到始端的时候不用管那些线条。 其实自己走一遍也不麻烦

代码感觉不好想,还是要多看看。


先写到这啦。

有问题欢迎指出!!一起加油!!

你可能感兴趣的:(算法--学习笔记,深度优先,算法,c++)