N皇后问题(递归+回溯)的C++实现

版权声明:本博客的所有内容采用Creative Commons(知识共享)许可证,作者权利:署名(BY)& 非商业性使用(NC)。转载时请务必标明文章超链接、作者信息和本声明,禁止用于商业用途。 https://blog.csdn.net/thinkerleo1997/article/details/78838439

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中解法。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页