递归求解
#include <stdio.h>
#define M 8
int a[M][M];
bool check(int i,int j);
void findQueen(int i);
void printQueens();
int sum;
int main() {
sum=0;
findQueen(0);
printf("%d",sum);
}
void findQueen(int i){
if(i>M-1){//超过M得解
sum++;
printQueens();
return;
}
for(int j=0;j<M;j++){
if(check(i,j)){
a[i][j]=1;//当前置为1
findQueen(i+1);//找下一个
a[i][j]=0;//回溯时清除!!
}
}
}
void printQueens(){
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
}
bool check(int i,int j){
for(int k=0;k<M;k++){
if(a[i][k]||a[k][j])
return false;
}
int ii=i-1,jj=j-1;
while(ii>=0&&jj>=0){
if(a[ii--][jj--])
return false;
}
ii=i+1;jj=j+1;
while(ii<M&&jj<M){
if(a[ii++][jj++])
return false;
}
ii=i+1;jj=j-1;
while(ii<M&&jj>=0){
if(a[ii++][jj--])
return false;
}
ii=i-1;jj=j+1;
while(ii>=0&&jj<M){
if(a[ii--][jj++])
return false;
}
return true;
}