DFS思路应用-穷举求解问题
在无路可走时,我们往往会选择搜索算法,因为我们期望利用计算机的高性能来有目的的穷举一个问题的部分甚至所有可能情况,从而在这些情况中寻找符合题目要求的答案。这也是“爆搜”之名的 由来
我们约定,对于问题的介入状态,叫初始状态,要求的状态叫目标状态。
这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)
搜索的要点:
-
选定初始状态,在某些问题中可能是从多个合法状态分别入手搜索;
-
遍历自初始状态或当前状态所产生的合法状态,产生新的状态并进入递归;
-
检查新状态是否为目标状态,是则返回,否则继续遍历,重复2-3步骤
对状态的处理:DFS时,用一个数组存放产生的所有状态
- 把初始状态放入数组中,设为当前状态;
- 扩展当前的状态,从合法状态中旬寻找一个新的状态放入数组中,同时把新产生的状态设为当前状态;
- 判断当前状态是否和前面的状态重复,如果重复则回到上一个状态,产生它的另一状态;
- 判断当前状态是否为目标状态,如果是目标目标状态,则找到一个解答,根据实际问题需求,选择继续寻找答案或是直接返回。
- 如果数组为空,说明对于该问题无解。
目录
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 数组表示数字是否用过。当