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