/*NQueen问题如果用简单的条件(即每次准备在第i行上找摆皇后的位置的时候,就从第i行的第0列到第n列
依次找符合条件的点(看和前面已经摆好皇后的i-1个皇后比较,看是否在同一列上是否在同一主对角线或
者副对角线上))搜索,这个过程耗时较多。解决方法:每放一个皇后,就将该皇后所在位置的列号作为
lie[]数组的下标,并将lie数组的该元素置为1,因为在矩阵中的特性(平行于主对角线的直线上的点的
横、纵坐标之差为定值(这边要加上n,因为数组下标没有负数),平行于主对角线的直线上的点的横、纵
坐标之和为定值),所以可以将摆皇后的位置的横、纵坐标的差以及和分别作为zhu[]和fu[]数组的下标,
并将之置为1,但是在改点的回溯完成后要讲因为在该点摆皇后所产生的lie、zhu、fu数组对应下标的元素
的值置0,因为这题要的是所有结果方案数*/
#include<stdio.h>
#include<stdlib.h>
#define N 25
int n,top,lie[N],zhu[N],fu[N];
int search(int cur)
{
int i,j,k;
if(cur>n)
{
top++;
return 0;
}
else
for(i=1;i<=n;i++)
{
if(!lie[i]&&!zhu[cur-i+n]&&!fu[cur+i])
{
lie[i]=zhu[cur-i+n]=fu[cur+i]=1;
search(cur+1);
lie[i]=zhu[cur-i+n]=fu[cur+i]=0;
}
}
return 0;
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
top=0;
search(1);
printf("%d/n",top);
}
return 0;
}