方法一:递归回溯;
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,a[20],sum;
void dfs(int x)
{
int i;
if(x>n)
{
sum++;
return ;
}
for(i=1;i<=n;i++)
{
a[x]=i;
if(canPlace(x,i))//检测当x行 i 列放置皇后 是否冲突
dfs(x+1);
}
}
bool canPlace(int l,int i)
{
for(int k=1;k<l;k++)
if(abs(l-k)==abs(a[k]-i)||i==a[k])//和其他皇后在一条斜线上,或在同一列
return 0;
return 1;
}
int main()
{
//ans[11]={0,1,0,0,2,10,4,40,92,352,724}
n=0;
while(n<11)
{
sum=0;
dfs(1);//从第一行第一个出发,递归搜索所有的路径
printf("%d,",sum);
n++;
}
return 0;
}
方法二: