暂时无讲解,仅供学习参考。
int n,sum;
bool dps(int a,int b,int c,int d)//a是列位置,b是右斜线的位置,c是左斜线的位置,d是行位置
{
if(d>=n)
{
sum++;
return true;
}
int j;
for(j=0;j<n;j++)
if((a&(1<<j))==0 && (b&(1<<(j+d)))==0 && (c&(1<<(j-d+n)))==0)//位置没有被占,则下一行
dps(a^(1<<j),b^(1<<(j+d)),c^(1<<(j-d+n)),d+1);
return true;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum=0;
dps(0,0,0,0);
printf("%d\n",sum);
}
return 0;
}