当在解决问题中所求的解不满足所求问题时,就“回溯”返回,尝试别的路径。满足回溯条件的某个状态的点称为“ 回溯点”。
用回溯法解决问题的所有解时,要回溯到根,且根节点的所有可行子树都要已被搜索才结束。
解题一般步骤
- 定义一个解空间(子集树、排列数二选一)
- 组织解空间
- 深度优先法搜索解空间
- 剪枝函数 避免移动到不可能产生解的子空间。
是否剪枝的依据:
- 约束函数–是否满足显约束
- 界限函数–是否满足隐约束
N皇后问题
问题描述:
在棋盘上放置8个皇后,使得它们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解。
方法一 递归回溯构造全排列
#incldue"stdio.h"
#include"math.h"
#define N 8//皇后的个数
int sun=0;//可能解的个数
int x[N+1]={
0};//x[i]的值第i行的第x[i]列
//剪枝函数
bool place(int k){
int i;
for(i=1;i<k;i++){
if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k