N皇后問題(遞歸+回溯)的C++實現

N皇后問題(遞歸+回溯)

採用C++仿函數技術實現的N皇后問題:

解決問題類:

//多皇后問題
class MultiQueens{
private:
    vector<int> queen_vec; //保存當前各個皇后的位置
    int solve;  //保存解的個數

    //檢測當前第k個皇后的位置是否合法
    bool Check(int k){
        for(int i=0;i<k;i++){
            if(abs(queen_vec[i]-queen_vec[k])==abs(i-k) || queen_vec[i]==queen_vec[k])
                return false;
        }  
        return true;  
    }

    //打印皇后位置  
    void print_queens(){
        std:: cout << "第" << solve << "號解" << endl;
        for(int i = 0; i < queen_vec.size(); i++){
            cout << i << "號皇后:Position " << queen_vec[i] << endl;
        }
        cout << endl;
    }

    //遞歸回溯函數
    void MultiQueensSlove(const int queen_num, const int k){
        for(int i = 0; i < queen_num; i++){
            queen_vec[k] = i;
            if(Check(k)){//符合條件
                if(k <= queen_num - 1){     
                    if(k == queen_num - 1){ //到了最後一個皇后
                        solve++;        //解的數量加1
                        print_queens(); //打印結果
                    }else{
                        MultiQueensSlove(queen_num, k + 1);  //遞歸調用解下一個皇后位置
                    }
                }
            }
            //不符合條件返回
        }
    } 

public:
    //仿函數
    void operator()(const int queen_num) {
        solve = 0;
        queen_vec.resize(queen_num);
        MultiQueensSlove(queen_num, 0);
    }
};

主函數:

int main(){
    //解並打印8皇后問題
    MultiQueens()(8);
}

結果

結果

這裏結果有省略,在不考慮棋盤對稱性的情況下,有92中解法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章