回溯法相对比较容易理解,借用树的递归遍历结构穷举问题接,思路为选择进入下一层,撤销选择,继续上一层的选择,注意不同问题跳过的选择不同,就好比N皇后问题
题目对应leetcode链接
我就不用c++中vector了,也不用字符串数组解决问题了这里只记录一下回溯思路以后有时间再写详细代码
void backtrack(int n, int row, char*& chessboard)
{
if (row == n)//用c++的对象方便多了...这里就用二维数组吧
{
push(chessboard);//自定义函数
return;
}
for (int col = 0; col < n; col++) {
if (isinvaild(row, col, chessboard, n)) {//判断是否可以放,不能跳过该问题,这里用col和上一层皇后位置比较即可判断,第一行都可以放
chessboard[row][col]='Q';//放皇后
backtrack(n,row+1,chessboard);//进入决策树下一层
chessboard[row][col]='.'//取消皇后
}
}
}
总结回溯算法与动态规划算法思路有类似之处
动态规划明确:状态,选择,最简单情况
回溯算法明确:路径,当前选择,约束条件
动态规划可以将递归树大幅度剪枝,通过备忘录实现,如果有些问题没有重叠子问题,某些比较困难的动态规划问题想不到动态转移方程,就被迫用回溯算法求解----虽然复杂度高
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)