回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
皇后问题:
八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
class NQueensII { public: int* x;//当前解 int N;//皇后个数 int sum = 0;//当前已找到的可行方案数 int totalNQueens(int n) { N = n; x = new int[N + 1]; backTrace(1); return sum; } /** * col行这个点,x[col]列这个点,与已经存在的几个皇后,是否符合要求,放到这个位置上, * @param col * @return */ bool place(int col) { for (int i = 1; i < col; i++) { if (abs(col - i) == abs(x[col] - x[i]) || x[col] == x[i]) { return false; } } return true; } void backTrace(int t) { if (t > N) { sum++; } else { //第t行,遍历所有的节点 for (int j = 1; j <= N; j++) { x[t] = j; //如果第j个节点可以放下皇后 if (place(t)) { //接着放下一个 backTrace(t + 1); } } } } };
来源:https://www.cnblogs.com/vczf/p/12556655.html