#include<bits/stdc++.h>
using namespace std;
int Map[15][15];
//用来保存当前的局势
int a[15];
//a数组用来保存当前的一个解
bool c=0;
//用来检查答案是否合格
int n,m,ans; //n是棋盘的大小
int check(int x,int y){
//用来检查第x行第y列当前是否能放下
int ret=1;
for(int i=x,j=y;i>=1,j<=n;i--,j++){
if(Map[i][j]==1) ret=0;
}
for(int i=x,j=y;i<=n,j>=1;i++,j--){
if(Map[i][j]==1) ret=0;
}
for(int i=x,j=y;i>=1,j>=1;i--,j--){
if(Map[i][j]==1) ret=0;
}
for(int i=x,j=y;i<=n,j<=n;i++,j++){
if(Map[i][j]==1) ret=0;
}
//用来判断左右对角线上有无棋子
for(int i=1;i<=n;i++){
if(Map[x][i]==1) ret=0;
if(Map[i][y]==1) ret=0;
}
//判断行列上有无元素
return ret;
}
void print(){
if(m>=3){
ans++;
return;
}
//只有小于3才输出,否则就只增加答案
m++;
ans++;
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
cout<<endl;
}
void search(int k){
//搜索当前第k行的摆放情况
if(k>n){
//如果已选完就输出
print();
return;
}
for(int i=1;i<=n;i++){
if(check(k,i)){
//如果满足条件,就选这个位置
Map[k][i]=1;
a[k]=i;
//选中一个以后就继续搜下一行
search(k+1);
Map[k][i]=0;
//回溯
}
}
}
int main(){
cin>>n;
search(1);
cout<<ans;
}
实在是不知道哪出问题了,真的是吐了。 前三个测试点过了,9以后的答案就比标准答案少一些