用回溯法解决问题步骤:
- 定义解空间;
- 确定易于搜索的解空间结构;
- 以
深度优先搜索的方式搜索解空间,搜索时用剪枝函数避免无效搜索。
递归回溯
void backtrack(int t)
{
if(t>n)output(x);
else
for(i=f(n,t);i<=g(n,t);i++)
{
x[t]=h(i);
if(约束函数&&限界函数)backtrack(t+1);
}
}
形式参数t表示当前递归的深度。
迭代回溯
void iterativeBacktrack()
{
int t=1;
while(t>0)
{
if(f(n,t)<=g(n,t))
for(i=f(n,t);i<=g(n,t);i++)
{
x[t]=h(i);
if(约束函数&&限界函数)
{
if(solution(t))output(x);
else t++;
}
else t--;
}
}