#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int res[100];
int n;//节点数目
int sum;
//定义k为当前节点,k+1即为下一节点
int vis[100];//标记列是否被访问
bool test(int k,int i)//当前为第k行第i列
{
//res[m]=n为第m个也就是第m行的点在第n列
for(int j=1; j<k; j++)
{
if(abs(j-k)==abs(res[j]-i))
{
return false;
}
}
return true;
}
void output()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(res[i]==j)
{
cout<<"1"<<' ';
}
else
{
cout<<"0"<<' ';
}
}
cout<<endl;
}
cout<<endl;
}
int dfs(int k)//到了第k个点
{
for(int i=1; i<=n; i++) //从第一列开始走
{
if(k==1||!vis[i]&&test(k,i))//之前没有点在这一列&&斜率满足题意
{
res[k]=i;//第k行放置在i列
vis[i]++;
if(k==n)
{
sum++;
output();
}
else
{
dfs(k+1);
}
vis[i]--;
}
}
}
void caller()
{
cin>>n;
sum=0;
dfs(1);
cout<<sum<<endl;
}
int main()
{
memset(res,0,sizeof(res));
memset(vis,0,sizeof(vis));
caller();
return 0;
}
Notes:hdu的n皇后问题要打表qwq,要不会超时qwq