#include <iostream>
#include <string>
#include <stdio.h>
#include <algorithm>
#include <math.h>
//n皇后问题用一维数组
//例如a[1]=2即代表第一行第二列摆了棋子
//这样直接排除同列情况
using namespace std;
int a[20];
int c[20];
int pd(int a[],int k)
{
int i;
for(i=1; i<=k-1; i++)
{
if(a[i]==a[k]||abs(i-k)==abs(a[i]-a[k]))//判断同行 同对角线
{
return 0;
}
}
return 1;
}
int main()
{
int n,i,k,count=0;
for(n=1;n<=10;n++)
{
count=0;
k=1;
a[k]=0;
while(k!=0)
{
a[k]++;
while(a[k]<=n&&!pd(a,k))
{
a[k]++;
}
if(a[k]>n) k--;//回溯,a[k]的值超过n,回溯到前一行
else
{
if(k==n) count++;
else
{
k++;
a[k]=0;
}
}
}
c[n]=count;
}
while(scanf("%d",&n)&&n)
{
printf("%d\n",c[n]);
}
}
用一维数组去代替二维坐标减少了步骤
判断对角线:abs(x1-x2)==abs(y1-y2)