深度优先搜索

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

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

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

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

#include <iostream>

int n ; // 数的数量,即扑克牌数量
int arr[10] ; // 盒子数量
int book[10] ; // 标记该张扑克牌还在不在手上,在的话为0,不在为1

using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值