经典的n皇后问题。
不过,这份代码是错误的,在回溯的时候出了问题。
#include <iostream>
using namespace std;
const int maxn=20;
int n,sum=0;
bool y[maxn]={false},d[maxn][maxn]={false};
void fib(int i){
if(i==n+1){
sum++;
return ;
}
for(int k=1;k<=n;k++){
if(y[k]==false&&d[i][k]==false){
d[i][k]=true;
y[k]=true;
for(int j=1;j<=n-i&&j<=n-k;j++){
d[i+j][k+j]=true;
}
for(int j=1;j<=n-i&&j<k;j++){
d[i+j][k-j]=true;
}
fib(i+1);
d[i][k]=false;
y[k]=false;
//这里,在回溯对角线上的标记时,会清除掉一些不该被清除的标记
//其实这里用d[][]来标记点的方法没什么问题,但是实现起来很麻烦。
//目前我见过两种方法,用flag查询对角线(不过这里要保存路径),和数组_2leftdown[2*n],_2rightdown[2*n]来标记(这个应该是经典解法)
for(int j=1;j<=n-i&&j<=n-k;j++){
d[i+j][k+j]=false;
}
for(int j=1;j<=n-i&&j<k;j++){
d[i+j][k-j]=false;
}
}
}
return ;
}
int main(){
cin>>n;
fib(1);
cout<<sum;
return 0;
}