Acwing dfs内容(第一次讲)第三讲

       今天讲的是DFS,学完算法基础课个人认为DFS那一章包括后面的图论是最难的一章,相信能刷到我的博客的都是天天刷的了,因为展示比较少很难找到,我打算先讲难点,其实这也是函数递归的也算是基础,前面的没学影响不大。

     打算讲递归搜索树,讲第一个递归例子裴波那契数列,然后讲y总蓝桥杯第一个题那个例题递归实现指数型枚举,我看很多朋友都说第一题就看题解,确实你要是初学者的话,你没学dfs咋可能一下理解哈哈哈,不说别的了上内容!

简单讲dfs是先向下搜,让后回溯到上一个树枝看看是否能继续向下走,如果能继续向下走就向下走然后回溯上一层一会看图

裴波拉契数列

Acwing dfs内容(第一次讲)第三讲_第1张图片

#include
using namespace std;
int f(int n)
{
    if(n==1)return 1;
    if(n==2)return 1;
    if(n>=3)return f(n-1)+f(n-2);
}
int main()
{
    int n;
    cin>>n;
    cout<

朴素版做法见谅

下面讲解dfs在这之前先讲一点声明:

        

//这里是代数的方式结合代码理解动画,所有我写的圈1,圈2表示的是代码运行的步骤顺序,写的坐标就是st[u]=的值(2,2,2)表示位置1 2 3 都不选就是输出空集

//所有的解释我都没写st[u]=0;因为有没有st[u]=0;回溯状态这个步骤都不影响ac因为只有st[u]=1才会输出

//continue就理解为回溯的意思英语不太好不好意思理解一下p是代码里if(u>n)...retrun;那段代码里的意思,确实就是输出那段代码

Acwing dfs内容(第一次讲)第三讲_第2张图片

#include 
#include 
#include 
#include 

using namespace std;

const int N = 16;

int n;
int st[N];  // 状态,记录每个位置当前的状态:0表示还没考虑,1表示选它,2表示不选它

void dfs(int u)
{
    if (u > n)
    {
        for (int i = 1; i <= n; i ++ )
            if (st[i] == 1)
                printf("%d ", i);
        printf("\n");
        return;
    }

    st[u] = 2;
    dfs(u + 1);     // 第一个分支:不选
    st[u] = 0;  // 恢复现场

    st[u] = 1;
    dfs(u + 1);     // 第二个分支:选
    st[u] = 0;
}

int main()
{
    cin >> n;

    dfs(1);

    return 0;
}

st[1]=2;

dfs(2);

st[2]=2;

dfs(3);

st[3]=2;

dfs(4);p空集;return;

dfs(3) continue;

st[3]=1;

dfs(4);p 3;return;

dfs(2) continue;

st[2]=1;

dfs(3);

st[3]=2;

dfs(4);p 2;return;

dfs(3) continue;

st[3]=1;

dfs(4); p 2 3;return;

dfs(1)continue;

st[1]=1;

dfs(2);

st[2]=2;

dfs(3);

st[3]=2;

dfs(4);p 1;return;

dfs(3)continue

st[3]=1;

dfs(4);p 1 3;return;

dfs(2)continue;

st[2]=1;

dfs(3);

st[3]=2;

dfs(4) p 1 2;return;

dfs(3)continue;

st[3]=1;

dfs(4);p 1 2 3;return;

//结合我的声明去理解这些数字。

今天讲到这里大概这星期更新完dfs bfs。

你可能感兴趣的:(深度优先,算法)