深度优先搜索 - DFS(暴搜)

DFS思路应用-穷举求解问题

在无路可走时,我们往往会选择搜索算法,因为我们期望利用计算机的高性能来有目的的穷举一个问题的部分甚至所有可能情况,从而在这些情况中寻找符合题目要求的答案。这也是“爆搜”之名的  由来

我们约定,对于问题的介入状态,叫初始状态,要求的状态叫目标状态
这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)

搜索的要点:

  1. 选定初始状态,在某些问题中可能是从多个合法状态分别入手搜索;

  2. 遍历自初始状态或当前状态所产生的合法状态,产生新的状态并进入递归;

  3. 检查新状态是否为目标状态,是则返回,否则继续遍历,重复2-3步骤

对状态的处理:DFS时,用一个数组存放产生的所有状态

  1. 把初始状态放入数组中,设为当前状态;
  2. 扩展当前的状态,从合法状态中旬寻找一个新的状态放入数组中,同时把新产生的状态设为当前状态;
  3. 判断当前状态是否和前面的状态重复,如果重复则回到上一个状态,产生它的另一状态;
  4. 判断当前状态是否为目标状态,如果是目标目标状态,则找到一个解答,根据实际问题需求,选择继续寻找答案或是直接返回。
  5. 如果数组为空,说明对于该问题无解。


 

目录

842. 排列数字

843. n-皇后问题

P1036 [NOIP2002 普及组] 选数

题1与题3的结合练习:

        P1157 组合的输出


842. 排列数字

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

 先画出递归搜索树

思路: 

  • 用 path 数组保存排列,当排列的长度为 n 时,是一种方案,输出。
  • 用 st 数组表示数字是否用过。当
  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NO.-LL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值