#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