本来是想用dfs(深搜),但由于N过大会发生爆栈的问题,在网上看到了构造法(即通过分析问题潜在的数学规律直接得到解的通解公式),详情见原文n皇后通解公式论文
通解公式的原理来源是由E.J.Hoffman、J.C.Loessi、R.C.Moore三人在1969年发表的一篇数学论文。嗯…看懂这个就直接利用公式写了。
AC代码:
#include<stdio.h>
print(int start,int end){
int i;
for(i=start;i<=end;i+=2)
{
printf("%d ",i);
}
}
int main()
{
int m,n;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
if(n%6!=2&&n%6!=3)
{
if(n%2==0)
{
print(2,n);
print(1,n-1);
}
else
{
print(2,n-1);
print(1,n);
}
}
else{
if(n%2==0)
{
m=n/2;
if(m%2==0){
print(m,n);
print(2,m-2);
print(m+3,n-1);
print(1,m+1);
}
else
{
print(m,n-1);
print(1,m-2);
print(m+3,n);
print(2,m+1);
}
}
else
{
m=(n-1)/2;
if(m%2==0)
{
print(m,n-1);
print(2,m-2);
print(m+3,n-2);
print(1,m+1);
printf("%d ",n);
}
else
{
print(m,n-2);
print(1,m-2);
print(m+3,n-1);
print(2,m+1);
printf("%d ",n);
}
}
}
}
return 0;
}