算法:Back Tracking回溯法
说到回溯法就让人头大,理解起来倒是很容易,就是把问题看成一个树形的解空间,然后在对这个空间进行DFS深度优先遍历的基础上进行剪枝操作但是要与具体问题结合起来分析就没那么简单了。看了网上很多回溯法的算法框架都写得不明所以,这种东西果然还是要自己动手写一些才行。
n皇后问题
这是回溯法可以解决的一个经典问题。回溯法大体上有递归和非递归两种解法,n皇后问题也不例外。
递归
1 | int queen[N] = {0}; |
非递归
1 | void Queen() |
回溯法框架
从具体例子反过来理解框架会方便一些
递归
1 | int a[n]; |
非递归
int a[n],i;//初始化数组a[]
i = 1;
while (i>0(有路可走) and (未达到目标)) // 还未回溯到头
{
if(i > n)// 搜索到叶结点
{
搜索到一个解,输出;
}
else // 处理第i个元素
{
a[i]第一个可能的值;
while(a[i]在不满足约束条件且在搜索空间内)
{
a[i]下一个可能的值;
}
if(a[i]在搜索空间内)
{
标识占用的资源;
i = i+1; // 扩展下一个结点
}
else
{
清理所占的状态空间; // 回溯
i = i –1;
}
}
未完maybe待续