图片来源:程序员小灰(微信公众号)
通用算法:
用回溯法解体的一个显著特征是 在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根节点到当前扩展节点的路径。如果解空间树中从根结点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))
代码如下
八皇后递归: (核心算法)
检查算法:
打印函数:
最后附上leetcode51题解:
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string> > res;
string str(n, '.');
vector<string> tmp(n, str);
backTracking(res, tmp, 0, n);
return res;
}
void backTracking(vector<vector<string> >& res, vector<string>& tmp, int index, int n){
if(index == n){ //index代表当前行是底index行
res.push_back(tmp);
return ;
}
//tmp[i]代表行数, str[j]代表列数
for(int i = 0; i < n; i++){ //棋子可以放置的位置 从第一个开始放判断是否合理
tmp[index][i] = 'Q';
if(checkQueen(tmp, index, i, n)){ //一个checKQueen方法,判断皇后可以放在当前位置
//则递归
backTracking(res, tmp, index + 1, n);
}
//否则回溯
tmp[index][i] = '.';
}
}
int checkQueen(vector<string> board, int x, int y, int n){
//保证皇后的可攻击范围内都没有皇后 三个循环 向上 向左上 向右上
for(int i = 0; i < x; i++){
if(board[x - 1 - i][y] == 'Q') return 0;
if(board[x - 1 - i][y - 1 - i] == 'Q') return 0;
if(board[x - 1 - i][y + 1 + i] == 'Q') return 0;
}
return 1;
}
};