深度优先搜索

来源:互联网 发布:双缝实验说明什么 知乎 编辑:程序博客网 时间:2024/06/15 09:35

一种俗称“不撞南墙不回头”的算法,是一直往下尝试任何一种可能性,然后返回到上一级,上一级尝试完后,返回更上一级。。。。以此类推尝试完全部的可能性。

下面通过数的全排列来说明这个算法

在《啊哈,算法》里面看到一个很好的阐释,这里引用下

把每个数看做一个个扑克牌,比如进行0,1,2,3四个数的全排列,便可以看做有这四个扑克牌,然后有四个盒子,编号为0,1,2,3,很自然想到用数组模拟这个盒子。然后依次向后放扑克牌,知道放完了之后,便取回,放到上一级的盒子里面

#include <iostream>int n ; // 数的数量,即扑克牌数量int arr[10] ; // 盒子数量int book[10] ; // 标记该张扑克牌还在不在手上,在的话为0,不在为1using std :: cout ;using std :: cin ;using std :: endl ;void dfs (int step) {    if (step == n + 1) {        for (int i = 0 ; i <= n ; i ++)            cout << arr[i] << " " ;        cout << endl ;        return ;    }    // 说明已经放完了全部的盒子    // 到达边界后,输出后返回    for (int i = 0 ; i <= n ; i ++) {        if (book[i] == 0) { // 说明这张扑克牌还在手上,便可以进行尝试            arr[step] = i ;            book[i] = 1 ;            // 放入盒子中            // 进行这一步的尝试            dfs (step + 1) ;            // 去到下一个盒子那里            // 进行下一步尝试            book [i] = 0 ;            // 很重要,取回的操作        }    }    return ;}int main () {    cin >> n ;    while (n >= 10 || n < 0) {        cin >> n ;     }    dfs (0) ;    return 0 ;}

由此可以得到一个关于这个算法的函数模型

void dfs (int step) {    判断边界    尝试每一种可能 for (int i = 0 ; i <= n ; i ++) {        继续下一步 dfs (step + 1) ;    }    return ;}
0 0