深度优先搜索dfs 讲解教程

一、数字全排列

小哈面前有三个箱子,手上有1,2,3三张牌,规定能放小牌就放小牌,小哈放完最后一个箱子后,最后在箱子的牌能有几种排列?

二、代码实现

#include <bits/stdc++.h>

using namespace std;

const int N = 10;
int a[N];
bool st[N];
int n = 3;

//函数说明:填充第几个盒子
void dfs(int step) {
    //如果全部填充完毕,走到了最后虚拟的n+1号盒子面前,就表示前面都完成了正确填充
    if (step == n + 1) {
        for (int i = 1; i <= n; i++) cout << a[i] << " ";
        cout << endl;
        return;
    }
    //每一个数字都可以用来填充
    for (int i = 1; i <= n; i++)
        //如果没有使用过
        if (!st[i]) {
            //放里
            a[step] = i;
            //标识已使用
            st[i] = true;
            //填充下一个
            dfs(step + 1);
            //标识未使用
            st[i] = false;
        }
}

int main() {
    //开始填充第一个盒子
    dfs(1);
    return 0;
}

三、[][][] + [][][] = [][][] 问题


#include <bits/stdc++.h>

using namespace std;
const int N = 10;

int a[N];
bool st[N];
int n = 9;

void dfs(int step) {
    if (step == n + 1) {
        if ((a[1] * 100 + a[2] * 10 + a[3]) + (a[4] * 100 + a[5] * 10 + a[6]) == a[7] * 100 + a[8] * 10 + a[9]) {
            for (int i = 1; i <= 9; i++) printf("%d ", a[i]);
            printf("
");
        }
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (!st[i]) {
            a[step] = i;
            st[i] = true;
            dfs(step + 1);
            st[i] = false;
        }
    }
}

int main() {
    dfs(1);
    return 0;
}

五、套路总结

深度优先搜索的基本模型

void dfs(int step)
   {
   //1、判断边界.收集结果

   //2、尝试每一种可能     
   for(i=1;i<=n;i++){
      //继续下一步        
        dfs(step+1);
    }
}

六、回溯与深度优先算法的关系总结

回溯与深度优先算法的关系总结

原文地址:https://www.cnblogs.com/littlehb/p/15094628.html