暴搜算法(穷举算法)实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就返回,尝试别的路径。
暴搜就是通过不断的搜索将所有情况枚举出来,依次判断,求得最终的答案,因此,暴搜的时间复杂度通常很大,相应的数据范围较小。
暴搜本质还是运用了递归的思想,重复调用自身函数求得答案。
需要将所有情况考虑的题目,都可以使用暴搜来写(但是耗时,经常TLE超时)
求出元素为m个的子集合,直接暴搜即可
思路:①先通过暴搜的思想把所有 n 个棋子的位置放好,再考虑这种放置方法是否可行
②判断放置方法是否可行:任意两个棋子不出现在同一条直线上
a.在同一行(列):只需要将所有棋子对应的行列记录下来,出现重复的方法即可直接舍去
b.在同一斜线上: 分为左斜线和右斜线
斜线1:当两个棋子的行列之差相等时,即在同一条斜线1上
斜线2:当两个棋子的行列之和相等时,即在同一条斜线2上
这里图示说明:
回溯是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
与暴搜的区别:在完成某个枚举时返回过程中,将在上一次枚举中修改过的变量返回到原来的状态
题目描述
输入一个数n,输出从 1 到 n 的所有排列情况(按字典序排列)