一、回溯法的解空间树有三种:子集树、排列树 和 完全n叉树。
1、子集树
//用回溯法搜索子集树
void Backtrack(int t){//从第t层开始
if(t>n) Output(x);
else{
for(int i=0;i<=1;i++){ //只有左子树,右子树两种选择
x[t] = i;
if(Constraint(t) && Bound(t))
Backetrack(t+1);
}
}
}
2、排列树
//用回溯法搜索排列树
void Backtrack(int t){
if(t>n) Output();
else {
for(int i=t;i<=n;i++){
Swap(x[i],x[t]);
if(Constraint(t) && Bound(t))
Backetrack(t+1);
Swap(x[i],x[t]);
}
}
}
3、完全n叉树(以n=4为例)
遍历完全n叉树需要n的n次幂
void BackTrack(int t){
if(t>n){
sum++;
}
for(int i=1;i<=n;i++){//从1到n,有n种选择
x[t]=i;
if(Place(t))
BackTrack(t+1);
}
}
二、回溯法效率分析