已经判明不满足要求的情况不再递归求解,相当于从状态树上把它和它的子树减去了
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
#define n 8
void queens(int chess[],int k,int &sum){
//假设前k-1行都排列好了
int i,j,tag;
if(k<n){
//第k行有八中取法
for (i=0;i<n;i++) {
chess[k]=i;tag=0;
//对于第k行的每一种取法,需要检验它与前k-1行的每一个棋子是否在同一列或对角线上
for (j=0;j<k;j++){
if (chess[k] == chess[j] || abs(chess[k] - chess[j]) == abs(k - j))
tag = 1;
}
//如果第k行取得位置合适
if(tag==0){
//如果是最后一行,解法总数+1,并输出该解
if(k==n-1){
sum++;
for (i=0;i<n;i++) {
cout<<chess[i]<<" ";
}
cout<<endl;
}
else
//如果不是最后一行,继续寻找下一行
queens(chess,k+1,sum);
}
}
}
}
int main(){
int chess[n];
//行数从0开始
memset(chess,0, sizeof(chess));
int sum=0;
queens(chess,0,sum);
cout<<sum<<"个解"<<endl;
return 0;
}