#include<iostream>
#include<math.h>
using namespace std;
int a[10];//a[i]=j代表第i行的皇后放在第几列 白皇后
int b[10];//黑皇后
int map[10][10];
int sum=0;
int n;
int judge(int now){
for(int i=1;i<now;i++){
if(a[i]==a[now]||abs(i-now)==abs(a[i]-a[now])) return 0;
}
return 1;
}
int judge1(int now){
for(int i=1;i<now;i++){
if(b[i]==b[now]||abs(i-now)==abs(b[i]-b[now])) return 0;
}
return 1;
}
void dfs_black(int now){
if(now>n){
sum++;
return ;
}
for(int i=1;i<=n;i++){
if(map[now][i]==0) continue;
b[now]=i;
if(judge1(now)) dfs_black(now+1);
}
}
void dfs_white(int now){//放置白皇后
if(now>n){
//这里是关键
for(int i=1;i<=n;i++) map[i][a[i]]=0;//尝试放置白皇后
dfs_black(1);//开始放置黑皇后
for(int i=1;i<=n;i++) map[i][a[i]]=1;//尝试结束后恢复
return;
}
for(int i=1;i<=n;i++){
if(map[now][i]==0) continue;//不能放置跳过
a[now]=i;
if(judge(now)){
dfs_white(now+1);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cin>>map[i][j];//1表示可以放 0表示不可以放
}
dfs_white(1);
cout<<sum;
}
知道n后问题如何解,这道题是很好的举一反三的例子吧。。。。。