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