N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。求放置的方法个数。
#include<iostream>
using namespace std;
int c[20],n,ok,count=0;
void print()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<n;j++)
{
if(c[i]==j)
cout<<"1 ";
else
cout<<"0 ";
}
cout<<endl;
}
}
void dfs(int r)
{
if(r==n)
{
print();
count++;
return ;
}
else
{
for(int i=0;i<n;i++)
{
c[r]=i;//第r行的皇后存储在第i列
ok=1;
for(int j=0;j<r;j++)//j表示r以前的行数
{
if(c[r]-c[j]==r-j||c[r]-c[j]==j-r||c[r]==c[j])
{
ok=0;
break;
}
}
if(ok)
dfs(r+1);
}
}
}
int main()
{
cin>>n;
dfs(0);
cout<<count;
return 0;
}