1.非递归回溯框架
int x[n]; //x存放解向量,全局变量
void backtrack(int n) //非递归框架
{ int i=1; //根结点层次为1
while (i>=1) //尚未回溯到头
{ if(ExistSubNode(t)) //当前结点存在子结点
{ for (j=下界;j<=上界;j++) //对于子集树,j=0到1循环
{ x[i]取一个可能的值;
if (constraint(i) && bound(i))
//x[i]满足约束条件或界限函数
{ if (x是一个可行解)
输出x;
else i++; //进入下一层次
}
}
}
else i--; //回溯:不存在子结点,返回上一层
}
}
2.递归算法框架
(1)解空间为子集树
子集树是每个元素只有两种扩展,要么选择要么不选择
int x[n]; //x存放解向量,全局变量
void backtrack(int i) //求解子集树的递归框架
{ if(i>n) //搜索到叶子结点,输出一个可行解
输出结果;
else
{ for (j=下界;j<=上界;j++) //用j枚举i所有可能的路径
{ x[i]=j; //产生一个可能的解分量
… //其他操作
if (constraint(i) && bound(i))
backtrack(i+1); //满足约束条件和限界函数,继续下一层
}
}
}
(2)解空间为排列树
int x[n]; //x存放解向量,并初始化
void backtrack(int i) //求解排列树的递归框架
{ if(i>n) //搜索到叶子结点,输出一个可行解
输出结果;
else
{ for (j=i;j<=n;j++) //用j枚举i所有可能的路径
{ … //第i层的结点选择x[j]的操作
swap(x[i],x[j]); //为保证排列中每个元素不同,通过交换来实现
if (constraint(i) && bound(i))
backtrack(i+1); //满足约束条件和限界函数,进入下一层
swap(x[i],x[j]); //恢复状态
… //第i层的结点选择x[j]的恢复操作
}
}
}