递归回溯法对解空间树作深度优先搜索,一般情况可表示为:
void backtrack(int n) {
if (is_ok()) {
print_reult();
// exit(0);
} else {
for (i = base(); i <= end(); i++) {
if (satisfy_constraint()) {
store();
result[n] = solve(i);
backtrack(n+1);
restore();
}
}
}
}
参数n表示递归的深度;
is_ok()表示已经求得问题解;
print_reult()表示打印结果;
如果只求出一个可行解,那么求得第一个问题解后便可exit(),如果要求出所有可行解则不需exit();
base()和end()分别表示在当前扩展节点处为搜索过的子树的起始编号和终止编号;
satisfy_constraint()表示满足问题的约束条件;
store()表示递归回溯前保护当前的部分解;
restore()表示递归回溯后还原原先的部分解;
solve(i)表示在当前扩展节点处result[n]的第i个可选值。