从第一层到第n层依次枚举
但是每次到底后会直接回到第一层,遍历下一个
结果一个解都没有(输出0)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int n,ans[N],sum;
bool a[N][N];
bool check(){ //检查是否无处可填
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(!a[i][j]) return 0;
return 1;
}
void dfs(int x,int y){
ans[x]=y;
if(check()) return ;
if(x==n){ //如果满了
if(sum<3){
for(int i=1;i<=n;++i)
printf("%lld ",ans[i]);
cout<<endl;
}
sum++;
return ;
}
for(int i=1;i<=n;++i){ //行和列
a[x][i]=1, a[i][y]=1;
}
int i=x,j=y; //对角线1
while(i>0&&i<=n&&j>0&&j<=n){
a[i][j]=1;
i++, j++;
}
i=x,j=y;
while(i>0&&i<=n&&j>0&&j<=n){
a[i][j]=1;
i--, j--;
}
i=x,j=y; //对角线2
while(i>0&&i<=n&&j>0&&j<=n){
a[i][j]=1;
i++, j--;
}
i=x,j=y;
while(i>0&&i<=n&&j>0&&j<=n){
a[i][j]=1;
i--, j++;
}
/*
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
printf("%d ",a[i][j]);
printf("\n");
}
cout<<endl;
*/
for(int i=1;i<=n;++i){ //遍历下一层
if(!a[x+1][i]){
dfs(x+1,i);
}
}
return ;
}
signed main(){
cin>>n;
for(int i=1;i<=n;++i){ //遍历第一层
dfs(1,i);
/*
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
printf("%d ",a[i][j]);
printf("\n");
}
cout<<endl;
*/
for(int j=1;j<=n;++j) //更新数组
for(int k=1;k<=n;++k) a[j][k]=0;
}
cout<<sum;
return 0;
}