//递归方法实现回溯法 void backtrack(int t){ //搜索解空间树第t层子树 //搜索到叶子节点 if(t > n) output(x); else //f(n,t)--当前扩展节点处未搜索过的子树的起始编号 //g(n,t)--当前扩展节点处为搜索过的子树的终止编号 for(int i = f(n,t);i <= g(n,t);i++){ //h(i)在当前扩展节点处x[t]的第i个可选值 x[t] = h(i); //constraint(t)当前扩展节点处的约束函数 //bound(t)当前扩展节点处的界限函数 //constraint(t)返回true,在当前扩展节点处x[1:t]取值满足问题的约束条件 //否则不满足问题的约束条件,可剪去相应的子树 //bound(t)返回true,在当前扩展节点处x[1:t]取值未使目标函数越界,由backtrack(t + 1)对其子树继续搜索 //否则 剪去相应子树 if(constraint(t) && bound(t)) backtrack(t + 1); } //执行了算法for循环后,已搜索遍当前扩展节点的所有未搜索过的子树. //backtrack(t)执行完毕,返回t - 1层继续执行.对还没测试过的x[t - 1]值继续搜索. } //非递归迭代过程 void iterativeBacktrack(){ int t = 1; while(t > 0){ if(f(n,t) <= g(n,t)) for(int i = f(n,t);i <= g(n,t);i++){ x[t] = h(i); if(constraint(t) && bound(t)){ //solution(t)判断在当前扩展节点处是否已得到问题的可行解 //返回true,在当前扩展结点处x[1:t]是问题的可行解. if(solution(t)) output(x); else{ //在当前扩展结点处x[1:t]只是问题的部分解,还需向纵深方向继续搜索 t++; } } } else{ //当前扩展节点的子树都已经搜索过,返回上一层. t--; } } //while执行完之后,完成整个回溯搜索过程. } //子集树 void backtrack(int t){ if(t > n) output(x); else for(int i = 0;i <= 1;i++){ x[t] = i; if(constraint(t) && bound(t)) backtrack(t + 1); } } //排列树 //在调用backtrack(1)执行回溯搜索之前,先将变量数组x初始化为单位排列(1,2,3,..,n) void backtrack(int t){ if(t > n) output(x); else for(int i = t;i <= n;i++){ swap(x[t],x[i]); if(constraint(t) && bound(t)) backtrack(t + 1); swap(x[t],x[i]); } }