算法思路:N皇后问题是一个经典的摆放皇后的问题,即在一个n*n的棋盘中摆放n个皇后,要求皇后们不能在棋盘同一行,同一列或同一对角线上,问一共有多少种摆法。此处我们用深度优先搜索的方法,从第一行开始摆,每次从每一行的1~n列中选出符合要求的位置并将皇后摆放在此位置,直到所有皇后摆放完毕则输出。(判断摆放位置是否符合要求用check函数,输出用output函数)。
#include<iostream>
using namespace std;
int n,a[101];
bool check(int r){ //检查此摆放是否符合要求
for(int i=1;i<r;i++){
if(a[i]==a[r]||abs(i-r)==abs(a[i]-a[r]))
return false;
}
return true;
}
void output(){ //输出当前棋盘
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i]==j)
cout<<"Q ";
else
cout<<". ";
}
cout<<endl;
}
cout<<endl;
}
void DFS(int r){
if(r==n+1){ //摆放完毕
output();
return;
}
else{
for(int i=1;i<=n;i++){
a[r]=i;
if(check(r))
DFS(r+1); //继续摆放第r+1行
}
}
}
int main(){
cout<<"请输入棋盘边长"<<endl;
cin>>n;
DFS(1); //从第一行开始摆放
return 0;
}