回溯算法

亡梦爱人 提交于 2020-03-24 08:40:16
  回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
 
皇后问题:
  八皇后问题:在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);
                }
            }
        }

    }
};

 


 

 

 
 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!